From 2a97bfcbe59f4d69e6ea95cce2dd7ef70eb89903 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 16 Oct 2023 12:14:26 +0200 Subject: [PATCH] add compiled contracts and docs --- .githooks/pre-commit | 10 + compiled-contracts/PolygonDataComittee.json | 1102 +++++++++ compiled-contracts/PolygonRollupManager.json | 2034 +++++++++++++++++ compiled-contracts/PolygonZkEVM.json | 41 +- compiled-contracts/PolygonZkEVMBridge.json | 59 +- .../PolygonZkEVMBridgeMock.json | 59 +- compiled-contracts/PolygonZkEVMBridgeV2.json | 924 ++++++++ .../PolygonZkEVMGlobalExitRoot.json | 98 +- .../PolygonZkEVMGlobalExitRootMock.json | 98 +- .../PolygonZkEVMGlobalExitRootV2.json | 148 ++ compiled-contracts/PolygonZkEVMMock.json | 46 +- compiled-contracts/PolygonZkEVMTimelock.json | 4 +- compiled-contracts/PolygonZkEVMV2.json | 1008 ++++++++ .../PolygonZkEVMV2Existent.json | 1046 +++++++++ compiled-contracts/TokenWrapped.json | 4 +- .../VerifierRollupHelperMock.json | 6 +- docs/PolygonZkEVM.md | 4 +- docs/PolygonZkEVMBridge.md | 4 + docs/PolygonZkEVMGlobalExitRoot.md | 9 - docs/lib/DepositContract.md | 43 + docs/v2/PolygonRollupManager.md | 455 ++-- docs/v2/PolygonZkEVMBridgeV2.md | 78 +- docs/v2/PolygonZkEVMGlobalExitRootV2.md | 26 - .../dataComittee/CDKDataCommittee.md | 75 + .../dataComittee/PolygonDataComittee.md | 76 + docs/v2/consensus/zkEVM/PolygonZkEVMV2.md | 28 + .../consensus/zkEVM/PolygonZkEVMV2Existent.md | 53 + docs/v2/interfaces/ICDKDataCommittee.md | 13 + docs/v2/interfaces/ICDKDataCommitteeErrors.md | 3 + docs/v2/interfaces/IPolygonDataComittee.md | 3 + docs/v2/interfaces/IPolygonRollupBase.md | 22 + docs/v2/interfaces/IPolygonRollupManager.md | 3 + docs/v2/interfaces/IPolygonZkEVMBaseBridge.md | 49 + docs/v2/interfaces/IPolygonZkEVMBridgeV2.md | 31 + docs/v2/interfaces/IPolygonZkEVMV2Errors.md | 3 + docs/v2/lib/DepositContractBase.md | 66 + docs/v2/lib/DepositContractV2.md | 31 + docs/v2/lib/LegacyZKEVMStateVariables.md | 5 + .../v2/lib/PolygonAccessControlUpgradeable.md | 186 ++ docs/v2/lib/PolygonRollupBase.md | 306 +++ docs/v2/lib/PolygonTransparentProxy.md | 37 + docs/v2/mocks/PolygonRollupManagerMock.md | 39 + package-lock.json | 182 +- package.json | 4 +- test/contracts/bridge.test.js | 6 +- 45 files changed, 7892 insertions(+), 635 deletions(-) create mode 100644 compiled-contracts/PolygonDataComittee.json create mode 100644 compiled-contracts/PolygonRollupManager.json create mode 100644 compiled-contracts/PolygonZkEVMBridgeV2.json create mode 100644 compiled-contracts/PolygonZkEVMGlobalExitRootV2.json create mode 100644 compiled-contracts/PolygonZkEVMV2.json create mode 100644 compiled-contracts/PolygonZkEVMV2Existent.json create mode 100644 docs/v2/consensus/dataComittee/CDKDataCommittee.md create mode 100644 docs/v2/consensus/dataComittee/PolygonDataComittee.md create mode 100644 docs/v2/consensus/zkEVM/PolygonZkEVMV2.md create mode 100644 docs/v2/consensus/zkEVM/PolygonZkEVMV2Existent.md create mode 100644 docs/v2/interfaces/ICDKDataCommittee.md create mode 100644 docs/v2/interfaces/ICDKDataCommitteeErrors.md create mode 100644 docs/v2/interfaces/IPolygonDataComittee.md create mode 100644 docs/v2/interfaces/IPolygonRollupBase.md create mode 100644 docs/v2/interfaces/IPolygonRollupManager.md create mode 100644 docs/v2/interfaces/IPolygonZkEVMBaseBridge.md create mode 100644 docs/v2/interfaces/IPolygonZkEVMBridgeV2.md create mode 100644 docs/v2/interfaces/IPolygonZkEVMV2Errors.md create mode 100644 docs/v2/lib/DepositContractBase.md create mode 100644 docs/v2/lib/DepositContractV2.md create mode 100644 docs/v2/lib/LegacyZKEVMStateVariables.md create mode 100644 docs/v2/lib/PolygonAccessControlUpgradeable.md create mode 100644 docs/v2/lib/PolygonRollupBase.md create mode 100644 docs/v2/lib/PolygonTransparentProxy.md create mode 100644 docs/v2/mocks/PolygonRollupManagerMock.md diff --git a/.githooks/pre-commit b/.githooks/pre-commit index aa61c0d70..862adad31 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -22,6 +22,16 @@ if npm run lint; then cp artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json compiled-contracts/ cp artifacts/contracts/deployment/PolygonZkEVMDeployer.sol/PolygonZkEVMDeployer.json compiled-contracts/ cp artifacts/contracts/PolygonZkEVMTimelock.sol/PolygonZkEVMTimelock.json compiled-contracts/ + + cp artifacts/contracts/v2/PolygonRollupManager.sol/PolygonRollupManager.json compiled-contracts/ + cp artifacts/contracts/v2/PolygonZkEVMBridgeV2.sol/PolygonZkEVMBridgeV2.json compiled-contracts/ + cp artifacts/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol/PolygonZkEVMGlobalExitRootV2.json compiled-contracts/ + + cp artifacts/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol/PolygonZkEVMGlobalExitRootV2.json compiled-contracts/ + cp artifacts/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol/PolygonZkEVMV2.json compiled-contracts/ + cp artifacts/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol/PolygonZkEVMV2Existent.json compiled-contracts/ + + cp artifacts/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol/PolygonDataComittee.json compiled-contracts/ git add compiled-contracts exit 0 else diff --git a/compiled-contracts/PolygonDataComittee.json b/compiled-contracts/PolygonDataComittee.json new file mode 100644 index 000000000..a78aed2ea --- /dev/null +++ b/compiled-contracts/PolygonDataComittee.json @@ -0,0 +1,1102 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonDataComittee", + "sourceName": "contracts/v2/consensus/dataComittee/PolygonDataComittee.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "_bridgeAddress", + "type": "address" + }, + { + "internalType": "contract PolygonRollupManager", + "name": "_rollupManager", + "type": "address" + }, + { + "internalType": "contract ICDKDataCommittee", + "name": "_dataCommittee", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "BatchAlreadyVerified", + "type": "error" + }, + { + "inputs": [], + "name": "BatchNotSequencedOrNotSequenceEnd", + "type": "error" + }, + { + "inputs": [], + "name": "ExceedMaxVerifyBatches", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchBelowLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "FinalPendingStateNumInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesAlreadyActive", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "ForcedDataDoesNotMatch", + "type": "error" + }, + { + "inputs": [], + "name": "GasTokenNetworkMustBeZeroOnEther", + "type": "error" + }, + { + "inputs": [], + "name": "GlobalExitRootNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "HaltTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "InitNumBatchAboveLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "InitNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitializeTransaction", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeBatchTimeTarget", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeForceBatchTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeMultiplierBatchFee", + "type": "error" + }, + { + "inputs": [], + "name": "NewAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "NewPendingStateTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NewStateRootNotInsidePrime", + "type": "error" + }, + { + "inputs": [], + "name": "NewTrustedAggregatorTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughMaticAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughPOLAmount", + "type": "error" + }, + { + "inputs": [], + "name": "OldAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OldStateRootDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyPendingAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyRollupManager", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyTrustedAggregator", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyTrustedSequencer", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateNotConsolidable", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateTimeoutExceedHaltAggregationTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "SequenceWithDataAvailabilityNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "SequenceZeroBatches", + "type": "error" + }, + { + "inputs": [], + "name": "SequencedTimestampBelowForcedTimestamp", + "type": "error" + }, + { + "inputs": [], + "name": "SequencedTimestampInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "StoredRootMustBeDifferentThanNewRoot", + "type": "error" + }, + { + "inputs": [], + "name": "TransactionsLengthAboveMax", + "type": "error" + }, + { + "inputs": [], + "name": "TrustedAggregatorTimeoutExceedHaltAggregationTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "TrustedAggregatorTimeoutNotExpired", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AcceptAdminRole", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "ActivateForceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "forceBatchNum", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + } + ], + "name": "ForceBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + } + ], + "name": "SequenceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + } + ], + "name": "SequenceForceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "newforceBatchTimeout", + "type": "uint64" + } + ], + "name": "SetForceBatchTimeout", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newTrustedSequencer", + "type": "address" + } + ], + "name": "SetTrustedSequencer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "newTrustedSequencerURL", + "type": "string" + } + ], + "name": "SetTrustedSequencerURL", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "SwitchSequenceWithDataAvailability", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "TransferAdminRole", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "VerifyBatches", + "type": "event" + }, + { + "inputs": [], + "name": "BASE_INITIALIZE_TX_BRIDGE", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", + "outputs": [ + { + "internalType": "bytes1", + "name": "", + "type": "bytes1" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SIGNATURE_INITIALIZE_TX_R", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SIGNATURE_INITIALIZE_TX_S", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SIGNATURE_INITIALIZE_TX_V", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptAdminRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "activateForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "calculatePolPerForceBatch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "dataCommittee", + "outputs": [ + { + "internalType": "contract ICDKDataCommittee", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "polAmount", + "type": "uint256" + } + ], + "name": "forceBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "forceBatchTimeout", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "name": "forcedBatches", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenNetwork", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "networkID", + "type": "uint32" + }, + { + "internalType": "address", + "name": "_gasTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_gasTokenNetwork", + "type": "uint32" + } + ], + "name": "generateInitializeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "address", + "name": "sequencer", + "type": "address" + }, + { + "internalType": "uint32", + "name": "networkID", + "type": "uint32" + }, + { + "internalType": "address", + "name": "_gasTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_gasTokenNetwork", + "type": "uint32" + }, + { + "internalType": "string", + "name": "sequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "_networkName", + "type": "string" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isForcedBatchAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isSequenceWithDataAvailabilityAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastAccInputHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastForceBatch", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastForceBatchSequenced", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "networkName", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "lastVerifiedBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "newStateRoot", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "onVerifyBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pol", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rollupManager", + "outputs": [ + { + "internalType": "contract PolygonRollupManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "globalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "minForcedTimestamp", + "type": "uint64" + } + ], + "internalType": "struct PolygonRollupBase.BatchData[]", + "name": "batches", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "l2Coinbase", + "type": "address" + } + ], + "name": "sequenceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "transactionsHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "globalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "minForcedTimestamp", + "type": "uint64" + } + ], + "internalType": "struct PolygonDataComittee.ValidiumBatchData[]", + "name": "batches", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "l2Coinbase", + "type": "address" + }, + { + "internalType": "bytes", + "name": "dataAvailabilityMessage", + "type": "bytes" + } + ], + "name": "sequenceBatchesDataCommittee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "globalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "minForcedTimestamp", + "type": "uint64" + } + ], + "internalType": "struct PolygonRollupBase.ForcedBatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newforceBatchTimeout", + "type": "uint64" + } + ], + "name": "setForceBatchTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newTrustedSequencer", + "type": "address" + } + ], + "name": "setTrustedSequencer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "newTrustedSequencerURL", + "type": "string" + } + ], + "name": "setTrustedSequencerURL", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "switchSequenceWithDataAvailability", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "transferAdminRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "trustedSequencer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "trustedSequencerURL", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x61012060405234801562000011575f80fd5b506040516200466438038062004664833981016040819052620000349162000076565b6001600160a01b0394851660a05292841660805290831660c052821660e0521661010052620000f2565b6001600160a01b038116811462000073575f80fd5b50565b5f805f805f60a086880312156200008b575f80fd5b855162000098816200005e565b6020870151909550620000ab816200005e565b6040870151909450620000be816200005e565b6060870151909350620000d1816200005e565b6080870151909250620000e4816200005e565b809150509295509295909350565b60805160a05160c05160e05161010051614485620001df5f395f81816105000152611dfc01525f818161049401528181610900015281816109cf01528181610e4a0152818161101001528181611eb901528181611f8201528181611fa4015281816121330152818161265c01528181612729015281816128110152818161317f0152818161320001528181613222015261334401525f81816105b30152818161207a015261328b01525f818161067701528181611b72015281816129590152612ea601525f81816106c40152818161079f01528181611f0c01528181612050015261292e01526144855ff3fe608060405234801561000f575f80fd5b50600436106102c1575f3560e01c80636ff512cc1161017c578063c89e42df116100dd578063d8d1091b11610093578063eaeb077b1161006e578063eaeb077b14610706578063f35dda4714610719578063f851a44014610733575f80fd5b8063d8d1091b146106ac578063e46761c4146106bf578063e7a7ed02146106e6575f80fd5b8063d02103ca116100c3578063d02103ca14610672578063d690be3114610699578063d7bc90ff146106a1575f80fd5b8063c89e42df1461063f578063cfa8ed4714610652575f80fd5b8063aa3587d311610132578063b0afe15411610118578063b0afe154146105f0578063b81fcafd146105fc578063c754c7ed1461060f575f80fd5b8063aa3587d3146105d5578063ada8f919146105dd575f80fd5b806399af03971161016257806399af0397146105805780639e00187714610593578063a3c573eb146105ae575f80fd5b80636ff512cc146105655780638c3d730114610578575f80fd5b806347ebf1081161022657806356e29435116101dc5780635ec91958116101c25780635ec91958146105355780636b8616ce1461053d5780636e05d2cd1461055c575f80fd5b806356e29435146104fb5780635e9145c914610522575f80fd5b80634c21fef31161020c5780634c21fef3146104b65780634e487706146104e0578063542028d5146104f3575f80fd5b806347ebf1081461047c57806349b7b8021461048f575f80fd5b806332c2d1531161027b5780633cbc795b116102615780633cbc795b146103be57806340b5de6c146103fc5780634560526714610454575f80fd5b806332c2d153146103845780633c351e1014610399575f80fd5b806319d8ac61116102ab57806319d8ac61146102f557806326782247146103225780632b35b3ac14610367575f80fd5b8062d0295d146102c5578063107bf28c146102e0575b5f80fd5b6102cd610758565b6040519081526020015b60405180910390f35b6102e8610872565b6040516102d791906138be565b6007546103099067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102d7565b6001546103429073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d7565b6008546103749060ff1681565b60405190151581526020016102d7565b610397610392366004613917565b6108fe565b005b60085461034290610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546103e7907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102d7565b6104237fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102d7565b60075461030990700100000000000000000000000000000000900467ffffffffffffffff1681565b61039761048a366004613a62565b6109cd565b6103427f000000000000000000000000000000000000000000000000000000000000000081565b60085461037490790100000000000000000000000000000000000000000000000000900460ff1681565b6103976104ee366004613b12565b610f71565b6102e8611188565b6103427f000000000000000000000000000000000000000000000000000000000000000081565b610397610530366004613b75565b611195565b6103976111fe565b6102cd61054b366004613b12565b60066020525f908152604090205481565b6102cd60055481565b610397610573366004613bbc565b6112e6565b6103976113af565b6102e861058e366004613bd5565b611481565b61034273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103427f000000000000000000000000000000000000000000000000000000000000000081565b6103976116f9565b6103976105eb366004613bbc565b6117c9565b6102cd6405ca1ab1e081565b61039761060a366004613c4a565b611892565b600754610309907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61039761064d366004613cf3565b6121f8565b6002546103429073ffffffffffffffffffffffffffffffffffffffff1681565b6103427f000000000000000000000000000000000000000000000000000000000000000081565b6102e861228a565b6102cd635ca1ab1e81565b6103976106ba366004613d25565b6122a6565b6103427f000000000000000000000000000000000000000000000000000000000000000081565b6007546103099068010000000000000000900467ffffffffffffffff1681565b610397610714366004613d64565b6127d2565b610721601b81565b60405160ff90911681526020016102d7565b5f546103429062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156107e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108089190613dac565b6007549091505f906108469067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613df0565b67ffffffffffffffff169050805f03610861575f9250505090565b61086b8183613e18565b9250505090565b6004805461087f90613e50565b80601f01602080910402602001604051908101604052809291908181526020018280546108ab90613e50565b80156108f65780601f106108cd576101008083540402835291602001916108f6565b820191905f5260205f20905b8154815290600101906020018083116108d957829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461096d576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516109c091815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a3c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610a5a57505f54600160ff909116105b80610a735750303b158015610a7357505f5460ff166001145b610b04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b60575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610be78482613eee565b506004610bf48382613eee565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610c8b5763ffffffff841615610c8b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790555f610d1d878787611481565b8051602080830191909120604080515f93810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015610ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec99190614006565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a250505050508015610f67575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610fc7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561100e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015611077573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109b9190614021565b6111045760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611104576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461087f90613e50565b600854790100000000000000000000000000000000000000000000000000900460ff166111ee576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111f9838383612bb9565b505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611254576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611291576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461133c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc09060200161117d565b60015473ffffffffffffffffffffffffffffffffffffffff163314611400576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60605f60405180606001604052806021815260200161442f6021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe00000000000000000000000000000000000000000000000000000000179052905161157893929101614040565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611603573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661167b576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906116c09084906405ca1ab1e090635ca1ab1e90601b907fff000000000000000000000000000000000000000000000000000000000000009060200161406e565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461174f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461181f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce69060200161117d565b60025473ffffffffffffffffffffffffffffffffffffffff1633146118e3576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f81900361191e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561195a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff8083169270010000000000000000000000000000000090041690815f5b85811015611d42575f8b8b838181106119a1576119a16140c9565b9050608002018036038101906119b791906140f6565b805160608201519192509067ffffffffffffffff1615611b2f57856119db81614149565b9650505f8183602001518460600151604051602001611a3293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114611aba576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611b10576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86165f90815260066020526040812055611c2a565b602082015115801590611bf3575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af1158015611bcd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf19190613dac565b155b15611c2a576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080611c5d575042826040015167ffffffffffffffff16115b15611c94576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151965050508080611d3a9061416f565b915050611986565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611d99576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e090611e4a9086908c908c906004016141ed565b5f6040518083038186803b158015611e60575f80fd5b505afa158015611e72573d5f803e3d5ffd5b505050508167ffffffffffffffff168467ffffffffffffffff1614611f7c575f611e9c8386613df0565b9050611eb267ffffffffffffffff82168361420f565b9150611f337f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611eeb610758565b611ef59190614228565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613407565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612078337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561200b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061202f9190613dac565b6120399190614228565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906134db565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156120dd575f80fd5b505af11580156120ef573d5f803e3d5ffd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff89166004820152602481018690525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303815f875af115801561218f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b39190614006565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a2505050505050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461224e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361225a8282613eee565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b208160405161117d91906138be565b60405180606001604052806021815260200161442f6021913981565b60085460ff166122e2576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f81900361231d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612359576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161239491849170010000000000000000000000000000000090041661423f565b11156123cc576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff16905f5b83811015612656575f86868381811061240f5761240f6140c9565b90506020028101906124219190614252565b61242a9061428e565b90508361243681614149565b825180516020918201208185015160408087015190519499509194505f936124979386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f9081526006909352912054909150811461251f576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526006602052604081205561254360018861420f565b84036125b25742600760189054906101000a900467ffffffffffffffff1684604001516125709190614309565b67ffffffffffffffff1611156125b2576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061264e9061416f565b9150506123f4565b506126847f000000000000000000000000000000000000000000000000000000000000000084611eeb610758565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e730000000000000000000000000000000000000000000000000000000081529084166004820152602481018290525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303815f875af115801561276f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127939190614006565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff1661280e576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612878573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061289c9190613dac565b9050818111156128d8576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612914576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61295673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846134db565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129e49190613dac565b600780549192506801000000000000000090910467ffffffffffffffff16906008612a0e83614149565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612a4592919061432a565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff165f9081526006909352912055323303612b53576007546040805183815233602082015260609181018290525f918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612bb2565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612ba99493929190614339565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612c0a576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612c45576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612c81576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff8083169270010000000000000000000000000000000090041690815f5b858110156130b5575f898983818110612cc857612cc86140c9565b9050602002810190612cda9190614378565b612ce3906143aa565b8051805160209091012060608201519192509067ffffffffffffffff1615612e635785612d0f81614149565b9650505f8183602001518460600151604051602001612d6693929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114612dee576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015612e44576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86165f90815260066020526040812055612f9d565b602082015115801590612f27575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af1158015612f01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f259190613dac565b155b15612f5e576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015612f9d576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080612fd0575042826040015167ffffffffffffffff16115b15613007576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806130ad9061416f565b915050612cad565b5060075467ffffffffffffffff680100000000000000009091048116908416111561310c576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146131fa575f6131628386613df0565b905061317867ffffffffffffffff82168361420f565b91506131b17f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611eeb610758565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b613289337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561200b573d5f803e3d5ffd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156132ee575f80fd5b505af1158015613300573d5f803e3d5ffd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff89166004820152602481018690525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303815f875af11580156133a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133c49190614006565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a250505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111f99084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261353f565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135399085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613459565b50505050565b5f6135a0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661364a9092919063ffffffff16565b8051909150156111f957808060200190518101906135be9190614021565b6111f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610afb565b606061365884845f85613660565b949350505050565b6060824710156136f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610afb565b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405161371a919061441d565b5f6040518083038185875af1925050503d805f8114613754576040519150601f19603f3d011682016040523d82523d5f602084013e613759565b606091505b509150915061376a87838387613775565b979650505050505050565b6060831561380a5782515f036138035773ffffffffffffffffffffffffffffffffffffffff85163b613803576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610afb565b5081613658565b613658838381511561381f5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afb91906138be565b5f5b8381101561386d578181015183820152602001613855565b50505f910152565b5f815180845261388c816020860160208601613853565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6138d06020830184613875565b9392505050565b67ffffffffffffffff811681146138ec575f80fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff81168114613912575f80fd5b919050565b5f805f60608486031215613929575f80fd5b8335613934816138d7565b925060208401359150613949604085016138ef565b90509250925092565b803563ffffffff81168114613912575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156139b5576139b5613965565b60405290565b5f82601f8301126139ca575f80fd5b813567ffffffffffffffff808211156139e5576139e5613965565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613a2b57613a2b613965565b81604052838152866020858801011115613a43575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215613a78575f80fd5b613a81886138ef565b9650613a8f602089016138ef565b9550613a9d60408901613952565b9450613aab606089016138ef565b9350613ab960808901613952565b925060a088013567ffffffffffffffff80821115613ad5575f80fd5b613ae18b838c016139bb565b935060c08a0135915080821115613af6575f80fd5b50613b038a828b016139bb565b91505092959891949750929550565b5f60208284031215613b22575f80fd5b81356138d0816138d7565b5f8083601f840112613b3d575f80fd5b50813567ffffffffffffffff811115613b54575f80fd5b6020830191508360208260051b8501011115613b6e575f80fd5b9250929050565b5f805f60408486031215613b87575f80fd5b833567ffffffffffffffff811115613b9d575f80fd5b613ba986828701613b2d565b90945092506139499050602085016138ef565b5f60208284031215613bcc575f80fd5b6138d0826138ef565b5f805f60608486031215613be7575f80fd5b613bf084613952565b9250613bfe602085016138ef565b915061394960408501613952565b5f8083601f840112613c1c575f80fd5b50813567ffffffffffffffff811115613c33575f80fd5b602083019150836020828501011115613b6e575f80fd5b5f805f805f60608688031215613c5e575f80fd5b853567ffffffffffffffff80821115613c75575f80fd5b818801915088601f830112613c88575f80fd5b813581811115613c96575f80fd5b8960208260071b8501011115613caa575f80fd5b60208301975080965050613cc0602089016138ef565b94506040880135915080821115613cd5575f80fd5b50613ce288828901613c0c565b969995985093965092949392505050565b5f60208284031215613d03575f80fd5b813567ffffffffffffffff811115613d19575f80fd5b613658848285016139bb565b5f8060208385031215613d36575f80fd5b823567ffffffffffffffff811115613d4c575f80fd5b613d5885828601613b2d565b90969095509350505050565b5f805f60408486031215613d76575f80fd5b833567ffffffffffffffff811115613d8c575f80fd5b613d9886828701613c0c565b909790965060209590950135949350505050565b5f60208284031215613dbc575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613e1157613e11613dc3565b5092915050565b5f82613e4b577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c90821680613e6457607f821691505b602082108103613e9b577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f8211156111f9575f81815260208120601f850160051c81016020861015613ec75750805b601f850160051c820191505b81811015613ee657828155600101613ed3565b505050505050565b815167ffffffffffffffff811115613f0857613f08613965565b613f1c81613f168454613e50565b84613ea1565b602080601f831160018114613f6e575f8415613f385750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ee6565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613fba57888601518255948401946001909101908401613f9b565b5085821015613ff657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215614016575f80fd5b81516138d0816138d7565b5f60208284031215614031575f80fd5b815180151581146138d0575f80fd5b5f8351614051818460208801613853565b835190830190614065818360208801613853565b01949350505050565b5f865161407f818460208b01613853565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60808284031215614106575f80fd5b61410e613992565b8235815260208301356020820152604083013561412a816138d7565b6040820152606083013561413d816138d7565b60608201529392505050565b5f67ffffffffffffffff80831681810361416557614165613dc3565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361419f5761419f613dc3565b5060010190565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f6142066040830184866141a6565b95945050505050565b8181038181111561422257614222613dc3565b92915050565b808202811582820484141761422257614222613dc3565b8082018082111561422257614222613dc3565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614284575f80fd5b9190910192915050565b5f6060823603121561429e575f80fd5b6040516060810167ffffffffffffffff82821081831117156142c2576142c2613965565b8160405284359150808211156142d6575f80fd5b506142e3368286016139bb565b8252506020830135602082015260408301356142fe816138d7565b604082015292915050565b67ffffffffffffffff818116838216019080821115613e1157613e11613dc3565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f61436e6060830184866141a6565b9695505050505050565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614284575f80fd5b5f608082360312156143ba575f80fd5b6143c2613992565b823567ffffffffffffffff8111156143d8575f80fd5b6143e4368286016139bb565b8252506020830135602082015260408301356143ff816138d7565b60408201526060830135614412816138d7565b606082015292915050565b5f825161428481846020870161385356fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220e3dd0944c8635ef7e774cd50f37780a6963276b54f0e9e544486d1482271dffa64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102c1575f3560e01c80636ff512cc1161017c578063c89e42df116100dd578063d8d1091b11610093578063eaeb077b1161006e578063eaeb077b14610706578063f35dda4714610719578063f851a44014610733575f80fd5b8063d8d1091b146106ac578063e46761c4146106bf578063e7a7ed02146106e6575f80fd5b8063d02103ca116100c3578063d02103ca14610672578063d690be3114610699578063d7bc90ff146106a1575f80fd5b8063c89e42df1461063f578063cfa8ed4714610652575f80fd5b8063aa3587d311610132578063b0afe15411610118578063b0afe154146105f0578063b81fcafd146105fc578063c754c7ed1461060f575f80fd5b8063aa3587d3146105d5578063ada8f919146105dd575f80fd5b806399af03971161016257806399af0397146105805780639e00187714610593578063a3c573eb146105ae575f80fd5b80636ff512cc146105655780638c3d730114610578575f80fd5b806347ebf1081161022657806356e29435116101dc5780635ec91958116101c25780635ec91958146105355780636b8616ce1461053d5780636e05d2cd1461055c575f80fd5b806356e29435146104fb5780635e9145c914610522575f80fd5b80634c21fef31161020c5780634c21fef3146104b65780634e487706146104e0578063542028d5146104f3575f80fd5b806347ebf1081461047c57806349b7b8021461048f575f80fd5b806332c2d1531161027b5780633cbc795b116102615780633cbc795b146103be57806340b5de6c146103fc5780634560526714610454575f80fd5b806332c2d153146103845780633c351e1014610399575f80fd5b806319d8ac61116102ab57806319d8ac61146102f557806326782247146103225780632b35b3ac14610367575f80fd5b8062d0295d146102c5578063107bf28c146102e0575b5f80fd5b6102cd610758565b6040519081526020015b60405180910390f35b6102e8610872565b6040516102d791906138be565b6007546103099067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102d7565b6001546103429073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d7565b6008546103749060ff1681565b60405190151581526020016102d7565b610397610392366004613917565b6108fe565b005b60085461034290610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546103e7907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102d7565b6104237fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102d7565b60075461030990700100000000000000000000000000000000900467ffffffffffffffff1681565b61039761048a366004613a62565b6109cd565b6103427f000000000000000000000000000000000000000000000000000000000000000081565b60085461037490790100000000000000000000000000000000000000000000000000900460ff1681565b6103976104ee366004613b12565b610f71565b6102e8611188565b6103427f000000000000000000000000000000000000000000000000000000000000000081565b610397610530366004613b75565b611195565b6103976111fe565b6102cd61054b366004613b12565b60066020525f908152604090205481565b6102cd60055481565b610397610573366004613bbc565b6112e6565b6103976113af565b6102e861058e366004613bd5565b611481565b61034273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103427f000000000000000000000000000000000000000000000000000000000000000081565b6103976116f9565b6103976105eb366004613bbc565b6117c9565b6102cd6405ca1ab1e081565b61039761060a366004613c4a565b611892565b600754610309907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61039761064d366004613cf3565b6121f8565b6002546103429073ffffffffffffffffffffffffffffffffffffffff1681565b6103427f000000000000000000000000000000000000000000000000000000000000000081565b6102e861228a565b6102cd635ca1ab1e81565b6103976106ba366004613d25565b6122a6565b6103427f000000000000000000000000000000000000000000000000000000000000000081565b6007546103099068010000000000000000900467ffffffffffffffff1681565b610397610714366004613d64565b6127d2565b610721601b81565b60405160ff90911681526020016102d7565b5f546103429062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156107e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108089190613dac565b6007549091505f906108469067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613df0565b67ffffffffffffffff169050805f03610861575f9250505090565b61086b8183613e18565b9250505090565b6004805461087f90613e50565b80601f01602080910402602001604051908101604052809291908181526020018280546108ab90613e50565b80156108f65780601f106108cd576101008083540402835291602001916108f6565b820191905f5260205f20905b8154815290600101906020018083116108d957829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461096d576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516109c091815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a3c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610a5a57505f54600160ff909116105b80610a735750303b158015610a7357505f5460ff166001145b610b04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b60575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610be78482613eee565b506004610bf48382613eee565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610c8b5763ffffffff841615610c8b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790555f610d1d878787611481565b8051602080830191909120604080515f93810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015610ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec99190614006565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a250505050508015610f67575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610fc7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561100e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015611077573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109b9190614021565b6111045760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611104576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461087f90613e50565b600854790100000000000000000000000000000000000000000000000000900460ff166111ee576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111f9838383612bb9565b505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611254576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611291576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461133c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc09060200161117d565b60015473ffffffffffffffffffffffffffffffffffffffff163314611400576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60605f60405180606001604052806021815260200161442f6021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe00000000000000000000000000000000000000000000000000000000179052905161157893929101614040565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611603573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661167b576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906116c09084906405ca1ab1e090635ca1ab1e90601b907fff000000000000000000000000000000000000000000000000000000000000009060200161406e565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461174f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461181f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce69060200161117d565b60025473ffffffffffffffffffffffffffffffffffffffff1633146118e3576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f81900361191e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561195a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff8083169270010000000000000000000000000000000090041690815f5b85811015611d42575f8b8b838181106119a1576119a16140c9565b9050608002018036038101906119b791906140f6565b805160608201519192509067ffffffffffffffff1615611b2f57856119db81614149565b9650505f8183602001518460600151604051602001611a3293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114611aba576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611b10576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86165f90815260066020526040812055611c2a565b602082015115801590611bf3575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af1158015611bcd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf19190613dac565b155b15611c2a576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080611c5d575042826040015167ffffffffffffffff16115b15611c94576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151965050508080611d3a9061416f565b915050611986565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611d99576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e090611e4a9086908c908c906004016141ed565b5f6040518083038186803b158015611e60575f80fd5b505afa158015611e72573d5f803e3d5ffd5b505050508167ffffffffffffffff168467ffffffffffffffff1614611f7c575f611e9c8386613df0565b9050611eb267ffffffffffffffff82168361420f565b9150611f337f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611eeb610758565b611ef59190614228565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613407565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612078337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561200b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061202f9190613dac565b6120399190614228565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906134db565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156120dd575f80fd5b505af11580156120ef573d5f803e3d5ffd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff89166004820152602481018690525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303815f875af115801561218f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b39190614006565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a2505050505050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461224e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361225a8282613eee565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b208160405161117d91906138be565b60405180606001604052806021815260200161442f6021913981565b60085460ff166122e2576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f81900361231d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612359576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161239491849170010000000000000000000000000000000090041661423f565b11156123cc576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff16905f5b83811015612656575f86868381811061240f5761240f6140c9565b90506020028101906124219190614252565b61242a9061428e565b90508361243681614149565b825180516020918201208185015160408087015190519499509194505f936124979386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f9081526006909352912054909150811461251f576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526006602052604081205561254360018861420f565b84036125b25742600760189054906101000a900467ffffffffffffffff1684604001516125709190614309565b67ffffffffffffffff1611156125b2576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061264e9061416f565b9150506123f4565b506126847f000000000000000000000000000000000000000000000000000000000000000084611eeb610758565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e730000000000000000000000000000000000000000000000000000000081529084166004820152602481018290525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303815f875af115801561276f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127939190614006565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff1661280e576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612878573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061289c9190613dac565b9050818111156128d8576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612914576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61295673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846134db565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129e49190613dac565b600780549192506801000000000000000090910467ffffffffffffffff16906008612a0e83614149565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612a4592919061432a565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff165f9081526006909352912055323303612b53576007546040805183815233602082015260609181018290525f918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612bb2565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612ba99493929190614339565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612c0a576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612c45576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612c81576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff8083169270010000000000000000000000000000000090041690815f5b858110156130b5575f898983818110612cc857612cc86140c9565b9050602002810190612cda9190614378565b612ce3906143aa565b8051805160209091012060608201519192509067ffffffffffffffff1615612e635785612d0f81614149565b9650505f8183602001518460600151604051602001612d6693929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114612dee576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015612e44576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86165f90815260066020526040812055612f9d565b602082015115801590612f27575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af1158015612f01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f259190613dac565b155b15612f5e576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015612f9d576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080612fd0575042826040015167ffffffffffffffff16115b15613007576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806130ad9061416f565b915050612cad565b5060075467ffffffffffffffff680100000000000000009091048116908416111561310c576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146131fa575f6131628386613df0565b905061317867ffffffffffffffff82168361420f565b91506131b17f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611eeb610758565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b613289337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561200b573d5f803e3d5ffd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156132ee575f80fd5b505af1158015613300573d5f803e3d5ffd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff89166004820152602481018690525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303815f875af11580156133a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133c49190614006565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a250505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111f99084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261353f565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135399085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613459565b50505050565b5f6135a0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661364a9092919063ffffffff16565b8051909150156111f957808060200190518101906135be9190614021565b6111f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610afb565b606061365884845f85613660565b949350505050565b6060824710156136f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610afb565b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405161371a919061441d565b5f6040518083038185875af1925050503d805f8114613754576040519150601f19603f3d011682016040523d82523d5f602084013e613759565b606091505b509150915061376a87838387613775565b979650505050505050565b6060831561380a5782515f036138035773ffffffffffffffffffffffffffffffffffffffff85163b613803576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610afb565b5081613658565b613658838381511561381f5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afb91906138be565b5f5b8381101561386d578181015183820152602001613855565b50505f910152565b5f815180845261388c816020860160208601613853565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6138d06020830184613875565b9392505050565b67ffffffffffffffff811681146138ec575f80fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff81168114613912575f80fd5b919050565b5f805f60608486031215613929575f80fd5b8335613934816138d7565b925060208401359150613949604085016138ef565b90509250925092565b803563ffffffff81168114613912575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156139b5576139b5613965565b60405290565b5f82601f8301126139ca575f80fd5b813567ffffffffffffffff808211156139e5576139e5613965565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613a2b57613a2b613965565b81604052838152866020858801011115613a43575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215613a78575f80fd5b613a81886138ef565b9650613a8f602089016138ef565b9550613a9d60408901613952565b9450613aab606089016138ef565b9350613ab960808901613952565b925060a088013567ffffffffffffffff80821115613ad5575f80fd5b613ae18b838c016139bb565b935060c08a0135915080821115613af6575f80fd5b50613b038a828b016139bb565b91505092959891949750929550565b5f60208284031215613b22575f80fd5b81356138d0816138d7565b5f8083601f840112613b3d575f80fd5b50813567ffffffffffffffff811115613b54575f80fd5b6020830191508360208260051b8501011115613b6e575f80fd5b9250929050565b5f805f60408486031215613b87575f80fd5b833567ffffffffffffffff811115613b9d575f80fd5b613ba986828701613b2d565b90945092506139499050602085016138ef565b5f60208284031215613bcc575f80fd5b6138d0826138ef565b5f805f60608486031215613be7575f80fd5b613bf084613952565b9250613bfe602085016138ef565b915061394960408501613952565b5f8083601f840112613c1c575f80fd5b50813567ffffffffffffffff811115613c33575f80fd5b602083019150836020828501011115613b6e575f80fd5b5f805f805f60608688031215613c5e575f80fd5b853567ffffffffffffffff80821115613c75575f80fd5b818801915088601f830112613c88575f80fd5b813581811115613c96575f80fd5b8960208260071b8501011115613caa575f80fd5b60208301975080965050613cc0602089016138ef565b94506040880135915080821115613cd5575f80fd5b50613ce288828901613c0c565b969995985093965092949392505050565b5f60208284031215613d03575f80fd5b813567ffffffffffffffff811115613d19575f80fd5b613658848285016139bb565b5f8060208385031215613d36575f80fd5b823567ffffffffffffffff811115613d4c575f80fd5b613d5885828601613b2d565b90969095509350505050565b5f805f60408486031215613d76575f80fd5b833567ffffffffffffffff811115613d8c575f80fd5b613d9886828701613c0c565b909790965060209590950135949350505050565b5f60208284031215613dbc575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613e1157613e11613dc3565b5092915050565b5f82613e4b577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c90821680613e6457607f821691505b602082108103613e9b577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f8211156111f9575f81815260208120601f850160051c81016020861015613ec75750805b601f850160051c820191505b81811015613ee657828155600101613ed3565b505050505050565b815167ffffffffffffffff811115613f0857613f08613965565b613f1c81613f168454613e50565b84613ea1565b602080601f831160018114613f6e575f8415613f385750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ee6565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613fba57888601518255948401946001909101908401613f9b565b5085821015613ff657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215614016575f80fd5b81516138d0816138d7565b5f60208284031215614031575f80fd5b815180151581146138d0575f80fd5b5f8351614051818460208801613853565b835190830190614065818360208801613853565b01949350505050565b5f865161407f818460208b01613853565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60808284031215614106575f80fd5b61410e613992565b8235815260208301356020820152604083013561412a816138d7565b6040820152606083013561413d816138d7565b60608201529392505050565b5f67ffffffffffffffff80831681810361416557614165613dc3565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361419f5761419f613dc3565b5060010190565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f6142066040830184866141a6565b95945050505050565b8181038181111561422257614222613dc3565b92915050565b808202811582820484141761422257614222613dc3565b8082018082111561422257614222613dc3565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614284575f80fd5b9190910192915050565b5f6060823603121561429e575f80fd5b6040516060810167ffffffffffffffff82821081831117156142c2576142c2613965565b8160405284359150808211156142d6575f80fd5b506142e3368286016139bb565b8252506020830135602082015260408301356142fe816138d7565b604082015292915050565b67ffffffffffffffff818116838216019080821115613e1157613e11613dc3565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f61436e6060830184866141a6565b9695505050505050565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614284575f80fd5b5f608082360312156143ba575f80fd5b6143c2613992565b823567ffffffffffffffff8111156143d8575f80fd5b6143e4368286016139bb565b8252506020830135602082015260408301356143ff816138d7565b60408201526060830135614412816138d7565b606082015292915050565b5f825161428481846020870161385356fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220e3dd0944c8635ef7e774cd50f37780a6963276b54f0e9e544486d1482271dffa64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/PolygonRollupManager.json b/compiled-contracts/PolygonRollupManager.json new file mode 100644 index 000000000..59a7d86de --- /dev/null +++ b/compiled-contracts/PolygonRollupManager.json @@ -0,0 +1,2034 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonRollupManager", + "sourceName": "contracts/v2/PolygonRollupManager.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "_bridgeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AccessControlOnlyCanRenounceRolesForSelf", + "type": "error" + }, + { + "inputs": [], + "name": "AddressDoNotHaveRequiredRole", + "type": "error" + }, + { + "inputs": [], + "name": "AllzkEVMSequencedBatchesMustBeVerified", + "type": "error" + }, + { + "inputs": [], + "name": "BatchAlreadyVerified", + "type": "error" + }, + { + "inputs": [], + "name": "BatchFeeOutOfRange", + "type": "error" + }, + { + "inputs": [], + "name": "BatchNotSequencedOrNotSequenceEnd", + "type": "error" + }, + { + "inputs": [], + "name": "ChainIDAlreadyExist", + "type": "error" + }, + { + "inputs": [], + "name": "ConsensusAlreadyExist", + "type": "error" + }, + { + "inputs": [], + "name": "ConsensusDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "ExceedMaxVerifyBatches", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchBelowLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "FinalPendingStateNumInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesAlreadyActive", + "type": "error" + }, + { + "inputs": [], + "name": "HaltTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "InitBatchMustMatchCurrentForkID", + "type": "error" + }, + { + "inputs": [], + "name": "InitNumBatchAboveLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "InitNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeBatchTimeTarget", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeForceBatchTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeMultiplierBatchFee", + "type": "error" + }, + { + "inputs": [], + "name": "MustSequenceSomeBatch", + "type": "error" + }, + { + "inputs": [], + "name": "NewAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "NewPendingStateTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NewSequencedBatchMustBeBigger", + "type": "error" + }, + { + "inputs": [], + "name": "NewStateRootNotInsidePrime", + "type": "error" + }, + { + "inputs": [], + "name": "NewTrustedAggregatorTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NotSupportedCurrently", + "type": "error" + }, + { + "inputs": [], + "name": "OldAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OldStateRootDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyNotEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyPendingGovernance", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyTrustedAggregator", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateNotConsolidable", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateTimeoutExceedHaltAggregationTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "RollupMustExist", + "type": "error" + }, + { + "inputs": [], + "name": "RollupTypeDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "RollupTypeObsolete", + "type": "error" + }, + { + "inputs": [], + "name": "SenderMustBeRollup", + "type": "error" + }, + { + "inputs": [], + "name": "StoredRootMustBeDifferentThanNewRoot", + "type": "error" + }, + { + "inputs": [], + "name": "TrustedAggregatorTimeoutExceedHaltAggregationTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "TrustedAggregatorTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "UpdateNotCompatible", + "type": "error" + }, + { + "inputs": [], + "name": "UpdateToSameRollupTypeID", + "type": "error" + }, + { + "inputs": [], + "name": "VerifierAlreadyExist", + "type": "error" + }, + { + "inputs": [], + "name": "VerifierDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "VerifierMustBeDifferent", + "type": "error" + }, + { + "inputs": [], + "name": "VerifiersMustHaveSameGenesis", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "forkID", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "address", + "name": "rollupAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "chainID", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "rollupCompatibilityID", + "type": "uint8" + } + ], + "name": "AddExistingRollup", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "rollupTypeID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "consensusImplementation", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "forkID", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "rollupCompatibilityID", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "genesis", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "AddNewRollupType", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "exitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "pendingStateNum", + "type": "uint64" + } + ], + "name": "ConsolidatePendingState", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "rollupTypeID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "rollupAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "chainID", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "address", + "name": "gasTokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "gasTokenNetwork", + "type": "uint32" + } + ], + "name": "CreateNewRollup", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyStateActivated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyStateDeactivated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "rollupTypeID", + "type": "uint32" + } + ], + "name": "ObsoleteRollupType", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "lastBatchSequenced", + "type": "uint64" + } + ], + "name": "OnSequenceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "exitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "OverridePendingState", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "storedStateRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "provedStateRoot", + "type": "bytes32" + } + ], + "name": "ProveNonDeterministicPendingState", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newBatchFee", + "type": "uint256" + } + ], + "name": "SetBatchFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "newMultiplierBatchFee", + "type": "uint16" + } + ], + "name": "SetMultiplierBatchFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "newPendingStateTimeout", + "type": "uint64" + } + ], + "name": "SetPendingStateTimeout", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newTrustedAggregator", + "type": "address" + } + ], + "name": "SetTrustedAggregator", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "newTrustedAggregatorTimeout", + "type": "uint64" + } + ], + "name": "SetTrustedAggregatorTimeout", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "newVerifyBatchTimeTarget", + "type": "uint64" + } + ], + "name": "SetVerifyBatchTimeTarget", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "newRollupTypeID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "lastVerifiedBatchBeforeUpgrade", + "type": "uint64" + } + ], + "name": "UpdateRollup", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "exitRoot", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "VerifyBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "exitRoot", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "VerifyBatchesTrustedAggregator", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "activateEmergencyState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IPolygonRollupBase", + "name": "rollupAddress", + "type": "address" + }, + { + "internalType": "contract IVerifierRollup", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint64", + "name": "forkID", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "chainID", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "genesis", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "rollupCompatibilityID", + "type": "uint8" + } + ], + "name": "addExistingRollup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "consensusImplementation", + "type": "address" + }, + { + "internalType": "contract IVerifierRollup", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint64", + "name": "forkID", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "rollupCompatibilityID", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "genesis", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "addNewRollupType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "calculateRewardPerBatch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "chainID", + "type": "uint64" + } + ], + "name": "chainIDToRollupID", + "outputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "pendingStateNum", + "type": "uint64" + } + ], + "name": "consolidatePendingState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupTypeID", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "chainID", + "type": "uint64" + }, + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "sequencer", + "type": "address" + }, + { + "internalType": "address", + "name": "gasTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "gasTokenNetwork", + "type": "uint32" + }, + { + "internalType": "string", + "name": "sequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "networkName", + "type": "string" + } + ], + "name": "createNewRollup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "deactivateEmergencyState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getBatchFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getForcedBatchFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "initNumBatch", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "finalNewBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "newLocalExitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "oldStateRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "newStateRoot", + "type": "bytes32" + } + ], + "name": "getInputSnarkBytes", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + } + ], + "name": "getLastVerifiedBatch", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "batchNum", + "type": "uint64" + } + ], + "name": "getRollupBatchNumToStateRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRollupExitRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "batchNum", + "type": "uint64" + } + ], + "name": "getRollupPendingStateTransitions", + "outputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "lastVerifiedBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "exitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + } + ], + "internalType": "struct LegacyZKEVMStateVariables.PendingState", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "batchNum", + "type": "uint64" + } + ], + "name": "getRollupSequencedBatches", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "accInputHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "sequencedTimestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "previousLastBatchSequenced", + "type": "uint64" + } + ], + "internalType": "struct LegacyZKEVMStateVariables.SequencedBatchData", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "trustedAggregator", + "type": "address" + }, + { + "internalType": "uint64", + "name": "_pendingStateTimeout", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "_trustedAggregatorTimeout", + "type": "uint64" + }, + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "timelock", + "type": "address" + }, + { + "internalType": "address", + "name": "emergencyCouncil", + "type": "address" + }, + { + "internalType": "contract PolygonZkEVMV2Existent", + "name": "polygonZkEVM", + "type": "address" + }, + { + "internalType": "contract IVerifierRollup", + "name": "zkEVMVerifier", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isEmergencyState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "pendingStateNum", + "type": "uint64" + } + ], + "name": "isPendingStateConsolidable", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastAggregationTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "multiplierBatchFee", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupTypeID", + "type": "uint32" + } + ], + "name": "obsoleteRollupType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newSequencedBatches", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "newAccInputHash", + "type": "bytes32" + } + ], + "name": "onSequenceBatches", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "initPendingStateNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "finalPendingStateNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "initNumBatch", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "finalNewBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "newLocalExitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "newStateRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32[24]", + "name": "proof", + "type": "bytes32[24]" + } + ], + "name": "overridePendingState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingStateTimeout", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pol", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "initPendingStateNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "finalPendingStateNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "initNumBatch", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "finalNewBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "newLocalExitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "newStateRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32[24]", + "name": "proof", + "type": "bytes32[24]" + } + ], + "name": "proveNonDeterministicPendingState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rollupAddress", + "type": "address" + } + ], + "name": "rollupAddressToID", + "outputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rollupCount", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + } + ], + "name": "rollupIDToRollupData", + "outputs": [ + { + "internalType": "contract IPolygonRollupBase", + "name": "rollupContract", + "type": "address" + }, + { + "internalType": "uint64", + "name": "chainID", + "type": "uint64" + }, + { + "internalType": "contract IVerifierRollup", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint64", + "name": "forkID", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "lastLocalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "lastBatchSequenced", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "lastVerifiedBatch", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "lastPendingState", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "lastPendingStateConsolidated", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "lastVerifiedBatchBeforeUpgrade", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "rollupTypeID", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "rollupCompatibilityID", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rollupTypeCount", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "rollupTypeID", + "type": "uint64" + } + ], + "name": "rollupTypeMap", + "outputs": [ + { + "internalType": "address", + "name": "consensusImplementation", + "type": "address" + }, + { + "internalType": "contract IVerifierRollup", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint64", + "name": "forkID", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "rollupCompatibilityID", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "obsolete", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "genesis", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newBatchFee", + "type": "uint256" + } + ], + "name": "setBatchFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "newMultiplierBatchFee", + "type": "uint16" + } + ], + "name": "setMultiplierBatchFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newPendingStateTimeout", + "type": "uint64" + } + ], + "name": "setPendingStateTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newTrustedAggregatorTimeout", + "type": "uint64" + } + ], + "name": "setTrustedAggregatorTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newVerifyBatchTimeTarget", + "type": "uint64" + } + ], + "name": "setVerifyBatchTimeTarget", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalSequencedBatches", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalVerifiedBatches", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "trustedAggregatorTimeout", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransparentUpgradeableProxy", + "name": "rollupContract", + "type": "address" + }, + { + "internalType": "uint32", + "name": "newRollupTypeID", + "type": "uint32" + }, + { + "internalType": "bytes", + "name": "upgradeData", + "type": "bytes" + } + ], + "name": "updateRollup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "verifyBatchTimeTarget", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "pendingStateNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "initNumBatch", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "finalNewBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "newLocalExitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "newStateRoot", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "beneficiary", + "type": "address" + }, + { + "internalType": "bytes32[24]", + "name": "proof", + "type": "bytes32[24]" + } + ], + "name": "verifyBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "pendingStateNum", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "initNumBatch", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "finalNewBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "newLocalExitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "newStateRoot", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "beneficiary", + "type": "address" + }, + { + "internalType": "bytes32[24]", + "name": "proof", + "type": "bytes32[24]" + } + ], + "name": "verifyBatchesTrustedAggregator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60e060405234801562000010575f80fd5b5060405162005b7b38038062005b7b833981016040819052620000339162000069565b6001600160a01b0392831660805290821660c0521660a052620000ba565b6001600160a01b038116811462000066575f80fd5b50565b5f805f606084860312156200007c575f80fd5b8351620000898162000051565b60208501519093506200009c8162000051565b6040850151909250620000af8162000051565b809150509250925092565b60805160a05160c051615a5e6200011d5f395f81816109fc01528181611c44015261366301525f81816106f2015281816127a8015261391a01525f818161093f01528181610c4d01528181610df501528181611992015261380f0152615a5e5ff3fe608060405234801562000010575f80fd5b506004361062000300575f3560e01c806391d148541162000197578063ceee281d11620000e7578063dde0ff77116200009b578063dde0ff7714620009ad578063e0bfd3d214620009c8578063e136edf714620009df578063e46761c414620009f6578063f34eb8eb1462000a1e578063f4e926751462000a35578063f9c4c2ae1462000a46575f80fd5b8063ceee281d1462000911578063d02103ca1462000939578063d5073f6f1462000961578063d547741f1462000978578063d939b315146200098f578063dbc1697614620009a3575f80fd5b8063a2967d99116200014b578063a2967d9914620006e2578063a3c573eb14620006ec578063a4810bb2146200072d578063afd23cbe14620007db578063b99d0ad71462000805578063c1acbc3414620008df578063c4c928c214620008fa575f80fd5b806391d14854146200067457806399f5634e146200068b5780639a908e7314620006955780639c9f3dfe14620006ac578063a066215c14620006c3578063a217fddf14620006da575f80fd5b80632f2ff15d11620002535780636046916911620002075780636046916914620005bc5780637222020f14620005c65780637975fcfe14620005dd5780637fb6e76a1462000603578063841b24d7146200062b57806387c20c0114620006465780638bd4f071146200065d575f80fd5b80632f2ff15d146200051457806336568abe146200052b578063394218e91462000542578063477fa27014620005595780634d4d3338146200056257806355a71ee01462000579575f80fd5b806315064c9611620002b757806315064c9614620003bf5780631608859c14620003cd5780631796a1ae14620003e45780631816b7e5146200040b5780632072f6c51462000422578063248a9ca3146200042c578063252801691462000460575f80fd5b8063066ec0121462000304578063080b311114620003355780630a0d9fbe146200035d57806311f6b287146200037857806312b86e19146200038f5780631489ed1014620003a8575b5f80fd5b60845462000318906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200034c6200034636600462004592565b62000b5c565b60405190151581526020016200032c565b6085546200031890600160401b90046001600160401b031681565b6200031862000389366004620045c8565b62000b85565b620003a6620003a0366004620045f6565b62000ba4565b005b620003a6620003b93660046200469d565b62000d4c565b606f546200034c9060ff1681565b620003a6620003de36600462004592565b62000eda565b607e54620003f59063ffffffff1681565b60405163ffffffff90911681526020016200032c565b620003a66200041c36600462004722565b62000f6d565b620003a662001018565b620004516200043d3660046200474c565b5f9081526034602052604090206001015490565b6040519081526020016200032c565b620004e06200047136600462004592565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200032c565b620003a66200052536600462004764565b62001091565b620003a66200053c36600462004764565b620010b9565b620003a66200055336600462004795565b620010f3565b60865462000451565b620003a662000573366004620047b1565b620011a6565b620004516200058a36600462004592565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000451620016e1565b620003a6620005d7366004620045c8565b620016f8565b620005f4620005ee36600462004862565b620017f2565b6040516200032c919062004915565b620003f56200061436600462004795565b60836020525f908152604090205463ffffffff1681565b6084546200031890600160c01b90046001600160401b031681565b620003a6620006573660046200469d565b62001824565b620003a66200066e366004620045f6565b62001b45565b6200034c6200068536600462004764565b62001bf9565b6200045162001c23565b62000318620006a636600462004929565b62001d04565b620003a6620006bd36600462004795565b62001ed0565b620003a6620006d436600462004795565b62001f75565b620004515f81565b6200045162002018565b620007147f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200032c565b620007916200073e36600462004795565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200032c565b608554620007f190600160801b900461ffff1681565b60405161ffff90911681526020016200032c565b6200089a6200081636600462004592565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200032c91905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200031890600160801b90046001600160401b031681565b620003a66200090b36600462004954565b620023e0565b620003f562000922366004620049e5565b60826020525f908152604090205463ffffffff1681565b620007147f000000000000000000000000000000000000000000000000000000000000000081565b620003a6620009723660046200474c565b620026b6565b620003a66200098936600462004764565b62002752565b60855462000318906001600160401b031681565b620003a66200277a565b6084546200031890600160401b90046001600160401b031681565b620003a6620009d936600462004a14565b62002823565b620003a6620009f036600462004b30565b620028b9565b620007147f000000000000000000000000000000000000000000000000000000000000000081565b620003a662000a2f36600462004c09565b62002d22565b608054620003f59063ffffffff1681565b62000adc62000a57366004620045c8565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200032c565b63ffffffff82165f90815260816020526040812062000b7c908362002f19565b90505b92915050565b63ffffffff81165f90815260816020526040812062000b7f9062002f5d565b5f8051602062005a0983398151915262000bbe8162002fcc565b63ffffffff89165f90815260816020526040902062000be4818a8a8a8a8a8a8a62002fd8565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562000c4b576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c8462002018565b6040518263ffffffff1660e01b815260040162000ca391815260200190565b5f604051808303815f87803b15801562000cbb575f80fd5b505af115801562000cce573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005a0983398151915262000d668162002fcc565b63ffffffff89165f90815260816020526040902062000d8c818a8a8a8a8a8a8a62003366565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b9004161562000df3576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e2c62002018565b6040518263ffffffff1660e01b815260040162000e4b91815260200190565b5f604051808303815f87803b15801562000e63575f80fd5b505af115801562000e76573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f90815260816020526040902062000f085f8051602062005a098339815191523362001bf9565b62000f5c57606f5460ff161562000f3257604051630bc011ff60e21b815260040160405180910390fd5b62000f3e818362002f19565b62000f5c57604051630674f25160e11b815260040160405180910390fd5b62000f6881836200372d565b505050565b5f80516020620059c983398151915262000f878162002fcc565b6103e88261ffff16108062000fa157506103ff8261ffff16115b1562000fc057604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620010325f80516020620059e98339815191523362001bf9565b620010855760845442906200105c9062093a8090600160801b90046001600160401b031662004caf565b6001600160401b03161115620010855760405163692baaad60e11b815260040160405180910390fd5b6200108f62003918565b565b5f82815260346020526040902060010154620010ad8162002fcc565b62000f68838362003992565b6001600160a01b0381163314620010e357604051630b4ad1cd60e31b815260040160405180910390fd5b620010ef8282620039fd565b5050565b5f80516020620059c98339815191526200110d8162002fcc565b606f5460ff166200114f576084546001600160401b03600160c01b9091048116908316106200114f5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016200100c565b5f54600290610100900460ff16158015620011c757505f5460ff8083169116105b620012305760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012b062003a66565b620012ca5f8051602062005a098339815191528a62003ad2565b620012d65f8662003ad2565b620013027fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003ad2565b6200132e7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003ad2565b6200135a7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003ad2565b620013867fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003ad2565b620013b27fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003ad2565b620013de7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003ad2565b620013f85f80516020620059c98339815191528762003ad2565b620014325f8051602062005a098339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003ade565b6200145e7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003ad2565b6200148a7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003ad2565b620014c45f80516020620059e98339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003ade565b620014de5f80516020620059e98339815191528562003ad2565b6200150a7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003ad2565b5f6200151d8484600561044d5f62003b28565b6073546074549192506001600160401b03600160401b909104811691168082146200155b57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b038181165f8181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb590708966200165c9695831695600160581b909104909216936076936077939192919091169060040162004d80565b5f604051808303815f87803b15801562001674575f80fd5b505af115801562001687573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620016ce9050565b60405180910390a1505050505050505050565b5f6086546064620016f3919062004de4565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017248162002fcc565b63ffffffff82161580620017435750607e5463ffffffff908116908316115b156200176257604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff1615159003620017a857604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b63ffffffff86165f9081526081602052604090206060906200181990878787878762003d40565b979650505050505050565b606f5460ff16156200184957604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a8116865260038301909452919093206001015442926200189792600160c01b90048116911662004caf565b6001600160401b03161115620018c057604051638a0704d360e01b815260040160405180910390fd5b6103e8620018cf888862004dfe565b6001600160401b03161115620018f857604051635acfba9d60e11b815260040160405180910390fd5b6200190a818989898989898962003366565b62001916818762003e7f565b6085546001600160401b03165f0362001a1d57600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001990576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620019c962002018565b6040518263ffffffff1660e01b8152600401620019e891815260200190565b5f604051808303815f87803b15801562001a00575f80fd5b505af115801562001a13573d5f803e3d5ffd5b5050505062001ae6565b62001a288162004076565b600681018054600160801b90046001600160401b031690601062001a4c8362004e21565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001b6a57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001b90818989898989898962002fd8565b6001600160401b0385165f9081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001bee62003918565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001c8a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001cb0919062004e49565b6084549091505f9062001cd6906001600160401b03600160401b82048116911662004dfe565b6001600160401b03169050805f0362001cf1575f9250505090565b62001cfd818362004e75565b9250505090565b606f545f9060ff161562001d2b57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362001d62576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f0362001d8c57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120608480549192879262001dbe9084906001600160401b031662004caf565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62001df3878362004caf565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001e828362004076565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f80516020620059c983398151915262001eea8162002fcc565b606f5460ff1662001f25576085546001600160401b039081169083161062001f255760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016200100c565b5f80516020620059c983398151915262001f8f8162002fcc565b62015180826001600160401b0316111562001fbd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016200100c565b6080545f9063ffffffff168082036200203257505f919050565b5f816001600160401b038111156200204e576200204e62004a8c565b60405190808252806020026020018201604052801562002078578160200160208202803683370190505b5090505f5b82811015620020e85760815f6200209683600162004e8b565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620020c857620020c862004ea1565b602090810291909101015280620020df8162004eb5565b9150506200207d565b505f60205b8360011462002340575f6200210460028662004ed0565b6200211160028762004e75565b6200211d919062004e8b565b90505f816001600160401b038111156200213b576200213b62004a8c565b60405190808252806020026020018201604052801562002165578160200160208202803683370190505b5090505f5b82811015620022ec576200218060018462004ee6565b811480156200219b57506200219760028862004ed0565b6001145b15620022235785620021af82600262004de4565b81518110620021c257620021c262004ea1565b602002602001015185604051602001620021e6929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002211576200221162004ea1565b602002602001018181525050620022d7565b856200223182600262004de4565b8151811062002244576200224462004ea1565b6020026020010151868260026200225c919062004de4565b6200226990600162004e8b565b815181106200227c576200227c62004ea1565b60200260200101516040516020016200229f929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620022ca57620022ca62004ea1565b6020026020010181815250505b80620022e38162004eb5565b9150506200216a565b50809450819550838460405160200162002310929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620023359062004efc565b9350505050620020ed565b5f835f8151811062002356576200235662004ea1565b602002602001015190505f5b82811015620023d657604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620023cd9062004eb5565b91505062002362565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200240c8162002fcc565b63ffffffff841615806200242b5750607e5463ffffffff908116908516115b156200244a57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff16908190036200248a576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b031603620024d857604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200251e57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200255c57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620025db8462000b85565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620026319216908b908b9060040162004f14565b5f604051808303815f87803b15801562002649575f80fd5b505af11580156200265c573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb620026e28162002fcc565b683635c9adc5dea00000821180620026fd5750633b9aca0082105b156200271c57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b2906020016200100c565b5f828152603460205260409020600101546200276e8162002fcc565b62000f688383620039fd565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f4620027a68162002fcc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620027ff575f80fd5b505af115801562002812573d5f803e3d5ffd5b50505050620028206200413f565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e6200284f8162002fcc565b6001600160401b0384165f9081526083602052604090205463ffffffff16156200288c576040516337c8fe0960e11b815260040160405180910390fd5b5f6200289c888888888762003b28565b5f8080526002909101602052604090209390935550505050505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08620028e58162002fcc565b63ffffffff89161580620029045750607e5463ffffffff908116908a16115b156200292357604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89165f908152607f60205260409020600180820154600160e81b900460ff16151590036200296957604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0389165f9081526083602052604090205463ffffffff1615620029a6576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620029c09063ffffffff1662004f53565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162002a0d9062004559565b62002a1b9392919062004f6e565b604051809103905ff08015801562002a35573d5f803e3d5ffd5b5090508160835f8d6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508b815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002ca295949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002ce4908e908e9088908f908f908f908f9060040162004fa4565b5f604051808303815f87803b15801562002cfc575f80fd5b505af115801562002d0f573d5f803e3d5ffd5b5050505050505050505050505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002d4e8162002fcc565b607e80545f9190829062002d689063ffffffff1662004f53565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff166001600160401b031681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002f079695949392919062005010565b60405180910390a25050505050505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002f4b92918116911662004caf565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002faf575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002820813362004197565b60078801545f906001600160401b0390811690871610156200300d5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620030ad5760068901546001600160401b03600160801b90910481169089161115620030575760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b9092041614620030a657604051632bd2e3e760e01b815260040160405180910390fd5b5062003121565b506001600160401b0385165f90815260028901602052604090205480620030e7576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200312157604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200315a5750876001600160401b0316876001600160401b031611155b806200317e575060068901546001600160401b03600160c01b909104811690881611155b156200319d5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620031e3576040516332a2a77f60e01b815260040160405180910390fd5b5f620031f48a888888868962003d40565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516200322a919062005068565b602060405180830381855afa15801562003246573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200326b919062004e49565b62003277919062004ed0565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620032bb9188919060040162005085565b602060405180830381865afa158015620032d7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620032fd9190620050c1565b6200331b576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620033595760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620033738a62002f5d565b60078b01549091506001600160401b039081169089161015620033a95760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200344b5760068a01546001600160401b03600160801b9091048116908a161115620033f35760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200344457604051632bd2e3e760e01b815260040160405180910390fd5b50620034ba565b6001600160401b0388165f90815260028b01602052604090205491508162003486576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620034ba57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620034ed5760405163b9b18f5760e01b815260040160405180910390fd5b5f620034fe8b8a8a8a878b62003d40565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003534919062005068565b602060405180830381855afa15801562003550573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003575919062004e49565b62003581919062004ed0565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035c59189919060040162005085565b602060405180830381865afa158015620035e1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620036079190620050c1565b62003625576040516309bde33960e01b815260040160405180910390fd5b5f62003632848b62004dfe565b90506200368b87826001600160401b03166200364d62001c23565b62003659919062004de4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620041c1565b80608460088282829054906101000a90046001600160401b0316620036b1919062004caf565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002ce4565b60068201546001600160401b03600160c01b90910481169082161115806200376c575060068201546001600160401b03600160801b9091048116908216115b156200378b5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200384662002018565b6040518263ffffffff1660e01b81526004016200386591815260200190565b5f604051808303815f87803b1580156200387d575f80fd5b505af115801562003890573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003971575f80fd5b505af115801562003984573d5f803e3d5ffd5b505050506200108f62004215565b6200399e828262001bf9565b620010ef575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003a09828262001bf9565b15620010ef575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f54610100900460ff166200108f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001227565b620010ef828262003992565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f918291829062003b439063ffffffff1662004f53565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f866001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f896001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915086825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555085826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555083825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003d2e94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003d75575081155b1562003d945760405163340c614f60e11b815260040160405180910390fd5b8062003db3576040516366385b5160e01b815260040160405180910390fd5b62003dbe8462004271565b62003ddc576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003e8b8362002f5d565b9050815f8062003e9c848462004dfe565b6085546001600160401b0391821692505f9162003ec291600160401b9004164262004ee6565b90505b846001600160401b0316846001600160401b03161462003f4b576001600160401b038085165f9081526003890160205260409020600181015490911682101562003f26576001810154600160401b90046001600160401b0316945062003f44565b62003f32868662004dfe565b6001600160401b031693505062003f4b565b5062003ec5565b5f62003f58848462004ee6565b90508381101562003fb657808403600c811162003f76578062003f79565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003fab5762003fab62004e61565b04608655506200402d565b838103600c811162003fc9578062003fcc565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004005576200400562004e61565b04905080608654670de0b6b3a7640000028162004026576200402662004e61565b0460865550505b683635c9adc5dea0000060865411156200405457683635c9adc5dea000006086556200406c565b633b9aca0060865410156200406c57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b909204161115620028205760068101545f90620040c090600160c01b90046001600160401b0316600162004caf565b9050620040ce828262002f19565b15620010ef5760068201545f90600290620040fb908490600160801b90046001600160401b031662004dfe565b620041079190620050e2565b62004113908362004caf565b905062004121838262002f19565b15620041335762000f6883826200372d565b62000f6883836200372d565b606f5460ff166200416357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620041a3828262001bf9565b620010ef57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f68908490620042f5565b606f5460ff16156200423a57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620042a7575067ffffffff00000001604083901c6001600160401b0316105b8015620042c8575067ffffffff00000001608083901c6001600160401b0316105b8015620042e0575067ffffffff0000000160c083901c105b15620042ee57506001919050565b505f919050565b5f6200434b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620043cd9092919063ffffffff16565b80519091501562000f6857808060200190518101906200436c9190620050c1565b62000f685760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001227565b6060620043dd84845f85620043e5565b949350505050565b606082471015620044485760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001227565b5f80866001600160a01b0316858760405162004465919062005068565b5f6040518083038185875af1925050503d805f8114620044a1576040519150601f19603f3d011682016040523d82523d5f602084013e620044a6565b606091505b5091509150620018198783838760608315620045265782515f036200451e576001600160a01b0385163b6200451e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001227565b5081620043dd565b620043dd83838151156200453d5781518083602001fd5b8060405162461bcd60e51b815260040162001227919062004915565b6108be806200510b83390190565b803563ffffffff8116811462002fc7575f80fd5b80356001600160401b038116811462002fc7575f80fd5b5f8060408385031215620045a4575f80fd5b620045af8362004567565b9150620045bf602084016200457b565b90509250929050565b5f60208284031215620045d9575f80fd5b62000b7c8262004567565b80610300810183101562000b7f575f80fd5b5f805f805f805f806103e0898b0312156200460f575f80fd5b6200461a8962004567565b97506200462a60208a016200457b565b96506200463a60408a016200457b565b95506200464a60608a016200457b565b94506200465a60808a016200457b565b935060a0890135925060c08901359150620046798a60e08b01620045e4565b90509295985092959890939650565b6001600160a01b038116811462002820575f80fd5b5f805f805f805f806103e0898b031215620046b6575f80fd5b620046c18962004567565b9750620046d160208a016200457b565b9650620046e160408a016200457b565b9550620046f160608a016200457b565b94506080890135935060a0890135925060c0890135620047118162004688565b9150620046798a60e08b01620045e4565b5f6020828403121562004733575f80fd5b813561ffff8116811462004745575f80fd5b9392505050565b5f602082840312156200475d575f80fd5b5035919050565b5f806040838503121562004776575f80fd5b8235915060208301356200478a8162004688565b809150509250929050565b5f60208284031215620047a6575f80fd5b62000b7c826200457b565b5f805f805f805f80610100898b031215620047ca575f80fd5b8835620047d78162004688565b9750620047e760208a016200457b565b9650620047f760408a016200457b565b95506060890135620048098162004688565b945060808901356200481b8162004688565b935060a08901356200482d8162004688565b925060c08901356200483f8162004688565b915060e0890135620048518162004688565b809150509295985092959890939650565b5f805f805f8060c0878903121562004878575f80fd5b620048838762004567565b955062004893602088016200457b565b9450620048a3604088016200457b565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620048e0578181015183820152602001620048c6565b50505f910152565b5f815180845262004901816020860160208601620048c4565b601f01601f19169290920160200192915050565b602081525f62000b7c6020830184620048e8565b5f80604083850312156200493b575f80fd5b62004946836200457b565b946020939093013593505050565b5f805f806060858703121562004968575f80fd5b8435620049758162004688565b9350620049856020860162004567565b925060408501356001600160401b0380821115620049a1575f80fd5b818701915087601f830112620049b5575f80fd5b813581811115620049c4575f80fd5b886020828501011115620049d6575f80fd5b95989497505060200194505050565b5f60208284031215620049f6575f80fd5b8135620047458162004688565b803560ff8116811462002fc7575f80fd5b5f805f805f8060c0878903121562004a2a575f80fd5b863562004a378162004688565b9550602087013562004a498162004688565b945062004a59604088016200457b565b935062004a69606088016200457b565b92506080870135915062004a8060a0880162004a03565b90509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262004ab0575f80fd5b81356001600160401b038082111562004acd5762004acd62004a8c565b604051601f8301601f19908116603f0116810190828211818310171562004af85762004af862004a8c565b8160405283815286602085880101111562004b11575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b03121562004b49575f80fd5b62004b548962004567565b975062004b6460208a016200457b565b9650604089013562004b768162004688565b9550606089013562004b888162004688565b9450608089013562004b9a8162004688565b935062004baa60a08a0162004567565b925060c08901356001600160401b038082111562004bc6575f80fd5b62004bd48c838d0162004aa0565b935060e08b013591508082111562004bea575f80fd5b5062004bf98b828c0162004aa0565b9150509295985092959890939650565b5f805f805f8060c0878903121562004c1f575f80fd5b863562004c2c8162004688565b9550602087013562004c3e8162004688565b945062004c4e604088016200457b565b935062004c5e6060880162004a03565b92506080870135915060a08701356001600160401b0381111562004c80575f80fd5b62004c8e89828a0162004aa0565b9150509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004cd25762004cd262004c9b565b5092915050565b80545f90600181811c908083168062004cf357607f831692505b6020808410820362004d1357634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004d31576001811462004d485762004d73565b60ff198716825285151560051b8201975062004d73565b5f898152602090205f5b8781101562004d6d5781548482015290860190840162004d52565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190525f9062004dad9083018762004cd9565b828103606084015262004dc1818762004cd9565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b7f5762000b7f62004c9b565b6001600160401b0382811682821603908082111562004cd25762004cd262004c9b565b5f6001600160401b0380831681810362004e3f5762004e3f62004c9b565b6001019392505050565b5f6020828403121562004e5a575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004e865762004e8662004e61565b500490565b8082018082111562000b7f5762000b7f62004c9b565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004ec95762004ec962004c9b565b5060010190565b5f8262004ee15762004ee162004e61565b500690565b8181038181111562000b7f5762000b7f62004c9b565b5f8162004f0d5762004f0d62004c9b565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f63ffffffff80831681810362004e3f5762004e3f62004c9b565b6001600160a01b038481168252831660208201526060604082018190525f9062004f9b90830184620048e8565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a082018190525f9062004fee90830185620048e8565b82810360c0840152620050028185620048e8565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f906200505c90830184620048e8565b98975050505050505050565b5f82516200507b818460208701620048c4565b9190910192915050565b6103208101610300808584378201835f5b6001811015620050b757815183526020928301929091019060010162005096565b5050509392505050565b5f60208284031215620050d2575f80fd5b8151801515811462004745575f80fd5b5f6001600160401b0380841680620050fe57620050fe62004e61565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c49d991c000dd664fa67a05338f92aab4c71dc2b0db71e34e45488392b18ca4864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220b4c0235190db25024bb30303391a6c88badbf76da86f61db9b19b9f2ce467d3564736f6c63430008140033", + "deployedBytecode": "0x608060405234801562000010575f80fd5b506004361062000300575f3560e01c806391d148541162000197578063ceee281d11620000e7578063dde0ff77116200009b578063dde0ff7714620009ad578063e0bfd3d214620009c8578063e136edf714620009df578063e46761c414620009f6578063f34eb8eb1462000a1e578063f4e926751462000a35578063f9c4c2ae1462000a46575f80fd5b8063ceee281d1462000911578063d02103ca1462000939578063d5073f6f1462000961578063d547741f1462000978578063d939b315146200098f578063dbc1697614620009a3575f80fd5b8063a2967d99116200014b578063a2967d9914620006e2578063a3c573eb14620006ec578063a4810bb2146200072d578063afd23cbe14620007db578063b99d0ad71462000805578063c1acbc3414620008df578063c4c928c214620008fa575f80fd5b806391d14854146200067457806399f5634e146200068b5780639a908e7314620006955780639c9f3dfe14620006ac578063a066215c14620006c3578063a217fddf14620006da575f80fd5b80632f2ff15d11620002535780636046916911620002075780636046916914620005bc5780637222020f14620005c65780637975fcfe14620005dd5780637fb6e76a1462000603578063841b24d7146200062b57806387c20c0114620006465780638bd4f071146200065d575f80fd5b80632f2ff15d146200051457806336568abe146200052b578063394218e91462000542578063477fa27014620005595780634d4d3338146200056257806355a71ee01462000579575f80fd5b806315064c9611620002b757806315064c9614620003bf5780631608859c14620003cd5780631796a1ae14620003e45780631816b7e5146200040b5780632072f6c51462000422578063248a9ca3146200042c578063252801691462000460575f80fd5b8063066ec0121462000304578063080b311114620003355780630a0d9fbe146200035d57806311f6b287146200037857806312b86e19146200038f5780631489ed1014620003a8575b5f80fd5b60845462000318906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200034c6200034636600462004592565b62000b5c565b60405190151581526020016200032c565b6085546200031890600160401b90046001600160401b031681565b6200031862000389366004620045c8565b62000b85565b620003a6620003a0366004620045f6565b62000ba4565b005b620003a6620003b93660046200469d565b62000d4c565b606f546200034c9060ff1681565b620003a6620003de36600462004592565b62000eda565b607e54620003f59063ffffffff1681565b60405163ffffffff90911681526020016200032c565b620003a66200041c36600462004722565b62000f6d565b620003a662001018565b620004516200043d3660046200474c565b5f9081526034602052604090206001015490565b6040519081526020016200032c565b620004e06200047136600462004592565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200032c565b620003a66200052536600462004764565b62001091565b620003a66200053c36600462004764565b620010b9565b620003a66200055336600462004795565b620010f3565b60865462000451565b620003a662000573366004620047b1565b620011a6565b620004516200058a36600462004592565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000451620016e1565b620003a6620005d7366004620045c8565b620016f8565b620005f4620005ee36600462004862565b620017f2565b6040516200032c919062004915565b620003f56200061436600462004795565b60836020525f908152604090205463ffffffff1681565b6084546200031890600160c01b90046001600160401b031681565b620003a6620006573660046200469d565b62001824565b620003a66200066e366004620045f6565b62001b45565b6200034c6200068536600462004764565b62001bf9565b6200045162001c23565b62000318620006a636600462004929565b62001d04565b620003a6620006bd36600462004795565b62001ed0565b620003a6620006d436600462004795565b62001f75565b620004515f81565b6200045162002018565b620007147f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200032c565b620007916200073e36600462004795565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200032c565b608554620007f190600160801b900461ffff1681565b60405161ffff90911681526020016200032c565b6200089a6200081636600462004592565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200032c91905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200031890600160801b90046001600160401b031681565b620003a66200090b36600462004954565b620023e0565b620003f562000922366004620049e5565b60826020525f908152604090205463ffffffff1681565b620007147f000000000000000000000000000000000000000000000000000000000000000081565b620003a6620009723660046200474c565b620026b6565b620003a66200098936600462004764565b62002752565b60855462000318906001600160401b031681565b620003a66200277a565b6084546200031890600160401b90046001600160401b031681565b620003a6620009d936600462004a14565b62002823565b620003a6620009f036600462004b30565b620028b9565b620007147f000000000000000000000000000000000000000000000000000000000000000081565b620003a662000a2f36600462004c09565b62002d22565b608054620003f59063ffffffff1681565b62000adc62000a57366004620045c8565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200032c565b63ffffffff82165f90815260816020526040812062000b7c908362002f19565b90505b92915050565b63ffffffff81165f90815260816020526040812062000b7f9062002f5d565b5f8051602062005a0983398151915262000bbe8162002fcc565b63ffffffff89165f90815260816020526040902062000be4818a8a8a8a8a8a8a62002fd8565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562000c4b576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c8462002018565b6040518263ffffffff1660e01b815260040162000ca391815260200190565b5f604051808303815f87803b15801562000cbb575f80fd5b505af115801562000cce573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005a0983398151915262000d668162002fcc565b63ffffffff89165f90815260816020526040902062000d8c818a8a8a8a8a8a8a62003366565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b9004161562000df3576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e2c62002018565b6040518263ffffffff1660e01b815260040162000e4b91815260200190565b5f604051808303815f87803b15801562000e63575f80fd5b505af115801562000e76573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f90815260816020526040902062000f085f8051602062005a098339815191523362001bf9565b62000f5c57606f5460ff161562000f3257604051630bc011ff60e21b815260040160405180910390fd5b62000f3e818362002f19565b62000f5c57604051630674f25160e11b815260040160405180910390fd5b62000f6881836200372d565b505050565b5f80516020620059c983398151915262000f878162002fcc565b6103e88261ffff16108062000fa157506103ff8261ffff16115b1562000fc057604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620010325f80516020620059e98339815191523362001bf9565b620010855760845442906200105c9062093a8090600160801b90046001600160401b031662004caf565b6001600160401b03161115620010855760405163692baaad60e11b815260040160405180910390fd5b6200108f62003918565b565b5f82815260346020526040902060010154620010ad8162002fcc565b62000f68838362003992565b6001600160a01b0381163314620010e357604051630b4ad1cd60e31b815260040160405180910390fd5b620010ef8282620039fd565b5050565b5f80516020620059c98339815191526200110d8162002fcc565b606f5460ff166200114f576084546001600160401b03600160c01b9091048116908316106200114f5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016200100c565b5f54600290610100900460ff16158015620011c757505f5460ff8083169116105b620012305760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012b062003a66565b620012ca5f8051602062005a098339815191528a62003ad2565b620012d65f8662003ad2565b620013027fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003ad2565b6200132e7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003ad2565b6200135a7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003ad2565b620013867fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003ad2565b620013b27fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003ad2565b620013de7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003ad2565b620013f85f80516020620059c98339815191528762003ad2565b620014325f8051602062005a098339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003ade565b6200145e7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003ad2565b6200148a7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003ad2565b620014c45f80516020620059e98339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003ade565b620014de5f80516020620059e98339815191528562003ad2565b6200150a7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003ad2565b5f6200151d8484600561044d5f62003b28565b6073546074549192506001600160401b03600160401b909104811691168082146200155b57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b038181165f8181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb590708966200165c9695831695600160581b909104909216936076936077939192919091169060040162004d80565b5f604051808303815f87803b15801562001674575f80fd5b505af115801562001687573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620016ce9050565b60405180910390a1505050505050505050565b5f6086546064620016f3919062004de4565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017248162002fcc565b63ffffffff82161580620017435750607e5463ffffffff908116908316115b156200176257604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff1615159003620017a857604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b63ffffffff86165f9081526081602052604090206060906200181990878787878762003d40565b979650505050505050565b606f5460ff16156200184957604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a8116865260038301909452919093206001015442926200189792600160c01b90048116911662004caf565b6001600160401b03161115620018c057604051638a0704d360e01b815260040160405180910390fd5b6103e8620018cf888862004dfe565b6001600160401b03161115620018f857604051635acfba9d60e11b815260040160405180910390fd5b6200190a818989898989898962003366565b62001916818762003e7f565b6085546001600160401b03165f0362001a1d57600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001990576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620019c962002018565b6040518263ffffffff1660e01b8152600401620019e891815260200190565b5f604051808303815f87803b15801562001a00575f80fd5b505af115801562001a13573d5f803e3d5ffd5b5050505062001ae6565b62001a288162004076565b600681018054600160801b90046001600160401b031690601062001a4c8362004e21565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001b6a57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001b90818989898989898962002fd8565b6001600160401b0385165f9081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001bee62003918565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001c8a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001cb0919062004e49565b6084549091505f9062001cd6906001600160401b03600160401b82048116911662004dfe565b6001600160401b03169050805f0362001cf1575f9250505090565b62001cfd818362004e75565b9250505090565b606f545f9060ff161562001d2b57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362001d62576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f0362001d8c57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120608480549192879262001dbe9084906001600160401b031662004caf565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62001df3878362004caf565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001e828362004076565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f80516020620059c983398151915262001eea8162002fcc565b606f5460ff1662001f25576085546001600160401b039081169083161062001f255760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016200100c565b5f80516020620059c983398151915262001f8f8162002fcc565b62015180826001600160401b0316111562001fbd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016200100c565b6080545f9063ffffffff168082036200203257505f919050565b5f816001600160401b038111156200204e576200204e62004a8c565b60405190808252806020026020018201604052801562002078578160200160208202803683370190505b5090505f5b82811015620020e85760815f6200209683600162004e8b565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620020c857620020c862004ea1565b602090810291909101015280620020df8162004eb5565b9150506200207d565b505f60205b8360011462002340575f6200210460028662004ed0565b6200211160028762004e75565b6200211d919062004e8b565b90505f816001600160401b038111156200213b576200213b62004a8c565b60405190808252806020026020018201604052801562002165578160200160208202803683370190505b5090505f5b82811015620022ec576200218060018462004ee6565b811480156200219b57506200219760028862004ed0565b6001145b15620022235785620021af82600262004de4565b81518110620021c257620021c262004ea1565b602002602001015185604051602001620021e6929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002211576200221162004ea1565b602002602001018181525050620022d7565b856200223182600262004de4565b8151811062002244576200224462004ea1565b6020026020010151868260026200225c919062004de4565b6200226990600162004e8b565b815181106200227c576200227c62004ea1565b60200260200101516040516020016200229f929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620022ca57620022ca62004ea1565b6020026020010181815250505b80620022e38162004eb5565b9150506200216a565b50809450819550838460405160200162002310929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620023359062004efc565b9350505050620020ed565b5f835f8151811062002356576200235662004ea1565b602002602001015190505f5b82811015620023d657604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620023cd9062004eb5565b91505062002362565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200240c8162002fcc565b63ffffffff841615806200242b5750607e5463ffffffff908116908516115b156200244a57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff16908190036200248a576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b031603620024d857604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200251e57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200255c57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620025db8462000b85565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620026319216908b908b9060040162004f14565b5f604051808303815f87803b15801562002649575f80fd5b505af11580156200265c573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb620026e28162002fcc565b683635c9adc5dea00000821180620026fd5750633b9aca0082105b156200271c57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b2906020016200100c565b5f828152603460205260409020600101546200276e8162002fcc565b62000f688383620039fd565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f4620027a68162002fcc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620027ff575f80fd5b505af115801562002812573d5f803e3d5ffd5b50505050620028206200413f565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e6200284f8162002fcc565b6001600160401b0384165f9081526083602052604090205463ffffffff16156200288c576040516337c8fe0960e11b815260040160405180910390fd5b5f6200289c888888888762003b28565b5f8080526002909101602052604090209390935550505050505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08620028e58162002fcc565b63ffffffff89161580620029045750607e5463ffffffff908116908a16115b156200292357604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89165f908152607f60205260409020600180820154600160e81b900460ff16151590036200296957604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0389165f9081526083602052604090205463ffffffff1615620029a6576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620029c09063ffffffff1662004f53565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162002a0d9062004559565b62002a1b9392919062004f6e565b604051809103905ff08015801562002a35573d5f803e3d5ffd5b5090508160835f8d6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508b815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002ca295949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002ce4908e908e9088908f908f908f908f9060040162004fa4565b5f604051808303815f87803b15801562002cfc575f80fd5b505af115801562002d0f573d5f803e3d5ffd5b5050505050505050505050505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002d4e8162002fcc565b607e80545f9190829062002d689063ffffffff1662004f53565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff166001600160401b031681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002f079695949392919062005010565b60405180910390a25050505050505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002f4b92918116911662004caf565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002faf575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002820813362004197565b60078801545f906001600160401b0390811690871610156200300d5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620030ad5760068901546001600160401b03600160801b90910481169089161115620030575760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b9092041614620030a657604051632bd2e3e760e01b815260040160405180910390fd5b5062003121565b506001600160401b0385165f90815260028901602052604090205480620030e7576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200312157604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200315a5750876001600160401b0316876001600160401b031611155b806200317e575060068901546001600160401b03600160c01b909104811690881611155b156200319d5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620031e3576040516332a2a77f60e01b815260040160405180910390fd5b5f620031f48a888888868962003d40565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516200322a919062005068565b602060405180830381855afa15801562003246573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200326b919062004e49565b62003277919062004ed0565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620032bb9188919060040162005085565b602060405180830381865afa158015620032d7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620032fd9190620050c1565b6200331b576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620033595760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620033738a62002f5d565b60078b01549091506001600160401b039081169089161015620033a95760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200344b5760068a01546001600160401b03600160801b9091048116908a161115620033f35760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200344457604051632bd2e3e760e01b815260040160405180910390fd5b50620034ba565b6001600160401b0388165f90815260028b01602052604090205491508162003486576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620034ba57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620034ed5760405163b9b18f5760e01b815260040160405180910390fd5b5f620034fe8b8a8a8a878b62003d40565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003534919062005068565b602060405180830381855afa15801562003550573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003575919062004e49565b62003581919062004ed0565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035c59189919060040162005085565b602060405180830381865afa158015620035e1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620036079190620050c1565b62003625576040516309bde33960e01b815260040160405180910390fd5b5f62003632848b62004dfe565b90506200368b87826001600160401b03166200364d62001c23565b62003659919062004de4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620041c1565b80608460088282829054906101000a90046001600160401b0316620036b1919062004caf565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002ce4565b60068201546001600160401b03600160c01b90910481169082161115806200376c575060068201546001600160401b03600160801b9091048116908216115b156200378b5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200384662002018565b6040518263ffffffff1660e01b81526004016200386591815260200190565b5f604051808303815f87803b1580156200387d575f80fd5b505af115801562003890573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003971575f80fd5b505af115801562003984573d5f803e3d5ffd5b505050506200108f62004215565b6200399e828262001bf9565b620010ef575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003a09828262001bf9565b15620010ef575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f54610100900460ff166200108f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001227565b620010ef828262003992565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f918291829062003b439063ffffffff1662004f53565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f866001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f896001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915086825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555085826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555083825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003d2e94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003d75575081155b1562003d945760405163340c614f60e11b815260040160405180910390fd5b8062003db3576040516366385b5160e01b815260040160405180910390fd5b62003dbe8462004271565b62003ddc576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003e8b8362002f5d565b9050815f8062003e9c848462004dfe565b6085546001600160401b0391821692505f9162003ec291600160401b9004164262004ee6565b90505b846001600160401b0316846001600160401b03161462003f4b576001600160401b038085165f9081526003890160205260409020600181015490911682101562003f26576001810154600160401b90046001600160401b0316945062003f44565b62003f32868662004dfe565b6001600160401b031693505062003f4b565b5062003ec5565b5f62003f58848462004ee6565b90508381101562003fb657808403600c811162003f76578062003f79565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003fab5762003fab62004e61565b04608655506200402d565b838103600c811162003fc9578062003fcc565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004005576200400562004e61565b04905080608654670de0b6b3a7640000028162004026576200402662004e61565b0460865550505b683635c9adc5dea0000060865411156200405457683635c9adc5dea000006086556200406c565b633b9aca0060865410156200406c57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b909204161115620028205760068101545f90620040c090600160c01b90046001600160401b0316600162004caf565b9050620040ce828262002f19565b15620010ef5760068201545f90600290620040fb908490600160801b90046001600160401b031662004dfe565b620041079190620050e2565b62004113908362004caf565b905062004121838262002f19565b15620041335762000f6883826200372d565b62000f6883836200372d565b606f5460ff166200416357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620041a3828262001bf9565b620010ef57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f68908490620042f5565b606f5460ff16156200423a57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620042a7575067ffffffff00000001604083901c6001600160401b0316105b8015620042c8575067ffffffff00000001608083901c6001600160401b0316105b8015620042e0575067ffffffff0000000160c083901c105b15620042ee57506001919050565b505f919050565b5f6200434b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620043cd9092919063ffffffff16565b80519091501562000f6857808060200190518101906200436c9190620050c1565b62000f685760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001227565b6060620043dd84845f85620043e5565b949350505050565b606082471015620044485760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001227565b5f80866001600160a01b0316858760405162004465919062005068565b5f6040518083038185875af1925050503d805f8114620044a1576040519150601f19603f3d011682016040523d82523d5f602084013e620044a6565b606091505b5091509150620018198783838760608315620045265782515f036200451e576001600160a01b0385163b6200451e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001227565b5081620043dd565b620043dd83838151156200453d5781518083602001fd5b8060405162461bcd60e51b815260040162001227919062004915565b6108be806200510b83390190565b803563ffffffff8116811462002fc7575f80fd5b80356001600160401b038116811462002fc7575f80fd5b5f8060408385031215620045a4575f80fd5b620045af8362004567565b9150620045bf602084016200457b565b90509250929050565b5f60208284031215620045d9575f80fd5b62000b7c8262004567565b80610300810183101562000b7f575f80fd5b5f805f805f805f806103e0898b0312156200460f575f80fd5b6200461a8962004567565b97506200462a60208a016200457b565b96506200463a60408a016200457b565b95506200464a60608a016200457b565b94506200465a60808a016200457b565b935060a0890135925060c08901359150620046798a60e08b01620045e4565b90509295985092959890939650565b6001600160a01b038116811462002820575f80fd5b5f805f805f805f806103e0898b031215620046b6575f80fd5b620046c18962004567565b9750620046d160208a016200457b565b9650620046e160408a016200457b565b9550620046f160608a016200457b565b94506080890135935060a0890135925060c0890135620047118162004688565b9150620046798a60e08b01620045e4565b5f6020828403121562004733575f80fd5b813561ffff8116811462004745575f80fd5b9392505050565b5f602082840312156200475d575f80fd5b5035919050565b5f806040838503121562004776575f80fd5b8235915060208301356200478a8162004688565b809150509250929050565b5f60208284031215620047a6575f80fd5b62000b7c826200457b565b5f805f805f805f80610100898b031215620047ca575f80fd5b8835620047d78162004688565b9750620047e760208a016200457b565b9650620047f760408a016200457b565b95506060890135620048098162004688565b945060808901356200481b8162004688565b935060a08901356200482d8162004688565b925060c08901356200483f8162004688565b915060e0890135620048518162004688565b809150509295985092959890939650565b5f805f805f8060c0878903121562004878575f80fd5b620048838762004567565b955062004893602088016200457b565b9450620048a3604088016200457b565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620048e0578181015183820152602001620048c6565b50505f910152565b5f815180845262004901816020860160208601620048c4565b601f01601f19169290920160200192915050565b602081525f62000b7c6020830184620048e8565b5f80604083850312156200493b575f80fd5b62004946836200457b565b946020939093013593505050565b5f805f806060858703121562004968575f80fd5b8435620049758162004688565b9350620049856020860162004567565b925060408501356001600160401b0380821115620049a1575f80fd5b818701915087601f830112620049b5575f80fd5b813581811115620049c4575f80fd5b886020828501011115620049d6575f80fd5b95989497505060200194505050565b5f60208284031215620049f6575f80fd5b8135620047458162004688565b803560ff8116811462002fc7575f80fd5b5f805f805f8060c0878903121562004a2a575f80fd5b863562004a378162004688565b9550602087013562004a498162004688565b945062004a59604088016200457b565b935062004a69606088016200457b565b92506080870135915062004a8060a0880162004a03565b90509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262004ab0575f80fd5b81356001600160401b038082111562004acd5762004acd62004a8c565b604051601f8301601f19908116603f0116810190828211818310171562004af85762004af862004a8c565b8160405283815286602085880101111562004b11575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b03121562004b49575f80fd5b62004b548962004567565b975062004b6460208a016200457b565b9650604089013562004b768162004688565b9550606089013562004b888162004688565b9450608089013562004b9a8162004688565b935062004baa60a08a0162004567565b925060c08901356001600160401b038082111562004bc6575f80fd5b62004bd48c838d0162004aa0565b935060e08b013591508082111562004bea575f80fd5b5062004bf98b828c0162004aa0565b9150509295985092959890939650565b5f805f805f8060c0878903121562004c1f575f80fd5b863562004c2c8162004688565b9550602087013562004c3e8162004688565b945062004c4e604088016200457b565b935062004c5e6060880162004a03565b92506080870135915060a08701356001600160401b0381111562004c80575f80fd5b62004c8e89828a0162004aa0565b9150509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004cd25762004cd262004c9b565b5092915050565b80545f90600181811c908083168062004cf357607f831692505b6020808410820362004d1357634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004d31576001811462004d485762004d73565b60ff198716825285151560051b8201975062004d73565b5f898152602090205f5b8781101562004d6d5781548482015290860190840162004d52565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190525f9062004dad9083018762004cd9565b828103606084015262004dc1818762004cd9565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b7f5762000b7f62004c9b565b6001600160401b0382811682821603908082111562004cd25762004cd262004c9b565b5f6001600160401b0380831681810362004e3f5762004e3f62004c9b565b6001019392505050565b5f6020828403121562004e5a575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004e865762004e8662004e61565b500490565b8082018082111562000b7f5762000b7f62004c9b565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004ec95762004ec962004c9b565b5060010190565b5f8262004ee15762004ee162004e61565b500690565b8181038181111562000b7f5762000b7f62004c9b565b5f8162004f0d5762004f0d62004c9b565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f63ffffffff80831681810362004e3f5762004e3f62004c9b565b6001600160a01b038481168252831660208201526060604082018190525f9062004f9b90830184620048e8565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a082018190525f9062004fee90830185620048e8565b82810360c0840152620050028185620048e8565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f906200505c90830184620048e8565b98975050505050505050565b5f82516200507b818460208701620048c4565b9190910192915050565b6103208101610300808584378201835f5b6001811015620050b757815183526020928301929091019060010162005096565b5050509392505050565b5f60208284031215620050d2575f80fd5b8151801515811462004745575f80fd5b5f6001600160401b0380841680620050fe57620050fe62004e61565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c49d991c000dd664fa67a05338f92aab4c71dc2b0db71e34e45488392b18ca4864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220b4c0235190db25024bb30303391a6c88badbf76da86f61db9b19b9f2ce467d3564736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/PolygonZkEVM.json b/compiled-contracts/PolygonZkEVM.json index 6d522c51b..981bf9bf9 100644 --- a/compiled-contracts/PolygonZkEVM.json +++ b/compiled-contracts/PolygonZkEVM.json @@ -848,19 +848,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "gapLastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "getForcedBatchFee", @@ -1109,6 +1096,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "lastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "lastVerifiedBatch", @@ -1351,9 +1351,14 @@ }, { "internalType": "bytes32", - "name": "forcedHistoricGlobalExitRoot", + "name": "globalExitRoot", "type": "bytes32" }, + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, { "internalType": "uint64", "name": "minForcedTimestamp", @@ -1386,7 +1391,7 @@ }, { "internalType": "bytes32", - "name": "forcedHistoricGlobalExitRoot", + "name": "globalExitRoot", "type": "bytes32" }, { @@ -1395,7 +1400,7 @@ "type": "uint64" } ], - "internalType": "struct PolygonZkEVM.BatchData[]", + "internalType": "struct PolygonZkEVM.ForcedBatchData[]", "name": "batches", "type": "tuple[]" } @@ -1706,8 +1711,8 @@ "type": "function" } ], - "bytecode": "0x61014060405234801562000011575f80fd5b5060405162005e7f38038062005e7f8339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051615c8f620001f05f395f818161066f01528181610dd301526130d801525f81816107db0152610da901525f81816107a1015281816124ba0152818161376a0152614ada01525f818161095901528181610f450152818161111001528181611935015281816125360152818161394b015261469401525f8181610a0601528181613ffd015261444b01525f818161089601528181611e1a01528181612ae70152818161392001526140e90152615c8f5ff3fe608060405234801561000f575f80fd5b50600436106103a9575f3560e01c80638c3d7301116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063ada8f9191161018a578063b6b0b0971161015a578063b6b0b09714610891578063ba58ae39146108b8578063c00e0dc9146108cb578063c0ed84e0146108de575f80fd5b8063ada8f919146107c3578063adc879e9146107d6578063afd23cbe146107fd578063b4d63f581461082b575f80fd5b80639aa972a3116101c55780639aa972a3146107635780639c9f3dfe14610776578063a066215c14610789578063a3c573eb1461079c575f80fd5b80638c3d7301146107355780638da5cb5b1461073d57806399f5634e1461075b575f80fd5b80634a1a89a7116102d65780636b8616ce1161026b5780637fcb36531161023b5780637fcb365314610656578063831c7ead1461066a578063837a473814610691578063841b24d714610705575f80fd5b80636b8616ce146106095780636ff512cc14610628578063715018a61461063b5780637215541a14610643575f80fd5b8063542028d5116102a6578063542028d5146105de5780635ec91958146105e657806360469169146105ee578063621dd411146105f6575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b80632a9f208f1161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b80632a9f208f146104af5780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e514610416578063220d78991461042b578063267822471461043e5780632987898314610483575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db91906151d6565b606f546104069060ff1681565b60405190151581526020016103db565b6104296104243660046151ef565b610b43565b005b6103ec610439366004615227565b610c5b565b607b5461045e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b60745461045e9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6073546103c69067ffffffffffffffff1681565b6104296104d1366004615287565b610e31565b6104296104e43660046152eb565b610ffb565b6104066104f7366004615360565b611203565b61042961050a366004615360565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b610429610599366004615360565b6113dc565b6104296105ac366004615360565b61148f565b6105d06105bf366004615360565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b610429611620565b6105d061171f565b610429610604366004615287565b611734565b6105d0610617366004615360565b60716020525f908152604090205481565b61042961063636600461539c565b611ab2565b610429611b87565b610429610651366004615360565b611b9a565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106d961069f3660046153b5565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429611d07565b60335473ffffffffffffffffffffffffffffffffffffffff1661045e565b6105d0611dd3565b6104296107713660046152eb565b611f26565b610429610784366004615360565b611fd6565b610429610797366004615360565b612152565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104296107d136600461539c565b612258565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f54610818906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61086b610839366004615360565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104066108c63660046153b5565b61231c565b6104296108d9366004615414565b6123a4565b6103c6612b58565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429610920366004615540565b612bab565b606f5461045e906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155b0565b612c38565b61042961099c36600461565b565b61317b565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b610429613717565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b610429610a3636600461569a565b6137eb565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a7636600461539c565b613bdb565b610429610a8936600461539c565b613cad565b607a5461045e9073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac4906156e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610af0906156e2565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d058461231c565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613d61565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110678787878787878761411c565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f90815260786020526040812054909242926112469270010000000000000000000000000000000090920481169116615760565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161454b565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac4906156e2565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611671576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff166116cd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f607054606461172f9190615788565b905090565b606f5460ff1615611771576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f9081526072602052604090206001015442926117bd92780100000000000000000000000000000000000000000000000090910481169116615760565b67ffffffffffffffff1611156117ff576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861180c868661579f565b67ffffffffffffffff16111561184e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185c868686868686613d61565b61186584614758565b607954700100000000000000000000000000000000900467ffffffffffffffff165f036119a657607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f908152607560205260409020839055607954161561190657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561198b575f80fd5b505af115801561199d573d5f803e3d5ffd5b50505050611a74565b6119ae614932565b6079805467ffffffffffffffff16905f6119c7836157c0565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611b03576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b611b8f6149e1565b611b985f614a62565b565b60335473ffffffffffffffffffffffffffffffffffffffff163314611cff575f611bc2612b58565b90508067ffffffffffffffff168267ffffffffffffffff1611611c11576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180611c56575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15611c8d576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f908152607260205260409020600101544291611cbb9162093a809116615760565b67ffffffffffffffff161115611cfd576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614ad8565b607b5473ffffffffffffffffffffffffffffffffffffffff163314611d58576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611e5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8391906157e6565b90505f611e8e612b58565b60735467ffffffffffffffff680100000000000000008204811691611ee6917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661579f565b611ef09190615760565b611efa919061579f565b67ffffffffffffffff169050805f03611f15575f9250505090565b611f1f818361582a565b9250505090565b606f5460ff1615611f63576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f728787878787878761411c565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611fcd614ad8565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612027576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561206e576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120d55760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106120d5576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156121ea576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612353575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612374575067ffffffff00000001608083901c67ffffffffffffffff16105b801561238b575067ffffffff0000000160c083901c105b1561239857506001919050565b505f919050565b919050565b606f5460ff16156123e1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612441576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361247c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156124b8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561251d575f80fd5b505af115801561252f573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561259d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c191906157e6565b60735467ffffffffffffffff68010000000000000000820481165f818152607260205260408120549495504294919370010000000000000000000000000000000090049092169182905b87811015612917575f8b8b838181106126265761262661583d565b9050602002810190612638919061586a565b612641906158a6565b8051805160209091012060408201519192509067ffffffffffffffff1615612832578561266d816157c0565b9650505f81836020015184604001516040516020016126c493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526071909352912054909150811461274c576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015181519384018a905290830185905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120955060715f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612902565b8151516201d4c01015612871576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018b905260c08a901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c820152609d016040516020818303038152906040528051906020012094505b5050808061290f90615932565b91505061260b565b506129228785615760565b60735490945067ffffffffffffffff78010000000000000000000000000000000000000000000000009091048116908416111561298b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060810182528381524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528b86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217948416830294909417905582547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169302929092179055879082811690851614612abd57612a5f828561579f565b612a739067ffffffffffffffff1682615969565b607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff88160217905590505b612b0f333083607054612ad09190615788565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614b5b565b612b17614932565b60405167ffffffffffffffff8616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a25050505050505050505050565b6079545f9067ffffffffffffffff1615612b9a575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612bfc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c0882826159c9565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c5091906151d6565b5f54610100900460ff1615808015612c5657505f54600160ff909116105b80612c6f5750303b158015612c6f57505f5460ff166001145b612d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612d5c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612d69602088018861539c565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612dbe604088016020890161539c565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e23608088016060890161539c565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ead86826159c9565b506077612eba85826159c9565b5062093a80612ecf6060890160408a01615360565b67ffffffffffffffff161115612f11576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f216060880160408901615360565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612f8360a0890160808a01615360565b67ffffffffffffffff161115612fc5576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fd560a0880160808901615360565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130b4614c3d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f000000000000000000000000000000000000000000000000000000000000000085856040516131099493929190615b28565b60405180910390a18015611fcd575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156131d8576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613215576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613250576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561328c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916132d7918491700100000000000000000000000000000000900416615b5f565b111561330f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135de575f87878381811061336d5761336d61583d565b905060200281019061337f919061586a565b613388906158a6565b905083613394816157c0565b825180516020918201208185015160408087015190519499509194505f936133f59386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f9081526071909352912054909150811461347d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134a1600189615969565b84036135105742607b60149054906101000a900467ffffffffffffffff1684604001516134ce9190615760565b67ffffffffffffffff161115613510576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083810151604080860151815193840189905290830185905260608084019290925260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120945050505080806135d690615932565b915050613352565b506135e98484615760565b6040805160608101825283815267ffffffffffffffff428116602080840191825260738054680100000000000000009081900485168688019081528589165f8181526072909552888520975188559451600190970180549151871683027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921697871697909717179095558054938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958402959095167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9094169390931793909317909155915192955090917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613768576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156137cd575f80fd5b505af11580156137df573d5f803e3d5ffd5b50505050611b98614cdc565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613848576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613885576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61388e61171f565b9050818111156138ca576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115613906576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61394873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614b5b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139d691906157e6565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a10836157c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a47929190615b72565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613b75576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613bd4565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613bcb9493929190615b81565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cb56149e1565b73ffffffffffffffffffffffffffffffffffffffff8116613d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612cf7565b61148c81614a62565b5f80613d6b612b58565b905067ffffffffffffffff881615613e3a5760795467ffffffffffffffff9081169089161115613dc7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e34576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613eda565b67ffffffffffffffff87165f90815260756020526040902054915081613e8c576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613eda576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f27576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f358888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613f699190615bb6565b602060405180830381855afa158015613f84573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613fa791906157e6565b613fb19190615bc7565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161403391899190600401615bda565b602060405180830381865afa15801561404e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140729190615c14565b6140a8576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614110336140b6858b61579f565b67ffffffffffffffff166140c8611dd3565b6140d29190615788565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614d6a565b50505050505050505050565b5f67ffffffffffffffff8816156141e85760795467ffffffffffffffff9081169089161115614177576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f9081526078602052604090206002810154815490928881166801000000000000000090920416146141e2576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614283565b5067ffffffffffffffff85165f9081526075602052604090205480614239576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115614283576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142b557508767ffffffffffffffff168767ffffffffffffffff1611155b806142dc575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614313576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614614375576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143838787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143b79190615bb6565b602060405180830381855afa1580156143d2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143f591906157e6565b6143ff9190615bc7565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161448191889190600401615bda565b602060405180830381865afa15801561449c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144c09190615c14565b6144f6576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614110576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614585575060795467ffffffffffffffff908116908216115b156145bc576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b1580156146ea575f80fd5b505af11580156146fc573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161474b91815260200190565b60405180910390a3505050565b5f614761612b58565b9050815f80614770848461579f565b606f5467ffffffffffffffff91821692505f916147939161010090041642615969565b90505b8467ffffffffffffffff168467ffffffffffffffff161461481d5767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156147fb57600181015468010000000000000000900467ffffffffffffffff169450614817565b614805868661579f565b67ffffffffffffffff1693505061481d565b50614796565b5f6148288484615969565b90508381101561487f57808403600c81116148435780614846565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614875576148756157fd565b04607055506148ee565b838103600c81116148905780614893565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816148c9576148c96157fd565b04905080607054670de0b6b3a764000002816148e7576148e76157fd565b0460705550505b683635c9adc5dea00000607054111561491357683635c9adc5dea00000607055611fcd565b633b9aca006070541015611fcd57633b9aca0060705550505050505050565b60795467ffffffffffffffff680100000000000000008204811691161115611b98576079545f9061497a9068010000000000000000900467ffffffffffffffff166001615760565b905061498581611203565b1561148c576079545f906002906149a790849067ffffffffffffffff1661579f565b6149b19190615c33565b6149bb9083615760565b90506149c681611203565b156149d8576149d48161454b565b5050565b6149d48261454b565b60335473ffffffffffffffffffffffffffffffffffffffff163314611b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612cf7565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614b3d575f80fd5b505af1158015614b4f573d5f803e3d5ffd5b50505050611b98614dc5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052614c379085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e57565b50505050565b5f54610100900460ff16614cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612cf7565b611b9833614a62565b606f5460ff16614d18576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614dc09084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401614bb5565b505050565b606f5460ff1615614e02576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f614eb8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614f629092919063ffffffff16565b805190915015614dc05780806020019051810190614ed69190615c14565b614dc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612cf7565b6060614f7084845f85614f78565b949350505050565b60608247101561500a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612cf7565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150329190615bb6565b5f6040518083038185875af1925050503d805f811461506c576040519150601f19603f3d011682016040523d82523d5f602084013e615071565b606091505b50915091506150828783838761508d565b979650505050505050565b606083156151225782515f0361511b5773ffffffffffffffffffffffffffffffffffffffff85163b61511b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612cf7565b5081614f70565b614f7083838151156151375781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf791906151d6565b5f5b8381101561518557818101518382015260200161516d565b50505f910152565b5f81518084526151a481602086016020860161516b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6151e8602083018461518d565b9392505050565b5f602082840312156151ff575f80fd5b813561ffff811681146151e8575f80fd5b803567ffffffffffffffff8116811461239f575f80fd5b5f805f805f60a0868803121561523b575f80fd5b61524486615210565b945061525260208701615210565b94979496505050506040830135926060810135926080909101359150565b806103008101831015615281575f80fd5b92915050565b5f805f805f806103a0878903121561529d575f80fd5b6152a687615210565b95506152b460208801615210565b94506152c260408801615210565b935060608701359250608087013591506152df8860a08901615270565b90509295509295509295565b5f805f805f805f6103c0888a031215615302575f80fd5b61530b88615210565b965061531960208901615210565b955061532760408901615210565b945061533560608901615210565b93506080880135925060a088013591506153528960c08a01615270565b905092959891949750929550565b5f60208284031215615370575f80fd5b6151e882615210565b803573ffffffffffffffffffffffffffffffffffffffff8116811461239f575f80fd5b5f602082840312156153ac575f80fd5b6151e882615379565b5f602082840312156153c5575f80fd5b5035919050565b5f8083601f8401126153dc575f80fd5b50813567ffffffffffffffff8111156153f3575f80fd5b6020830191508360208260051b850101111561540d575f80fd5b9250929050565b5f805f60408486031215615426575f80fd5b833567ffffffffffffffff81111561543c575f80fd5b615448868287016153cc565b909450925061545b905060208501615379565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f67ffffffffffffffff808411156154ab576154ab615464565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156154f1576154f1615464565b81604052809350858152868686011115615509575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f830112615531575f80fd5b6151e883833560208501615491565b5f60208284031215615550575f80fd5b813567ffffffffffffffff811115615566575f80fd5b614f7084828501615522565b5f8083601f840112615582575f80fd5b50813567ffffffffffffffff811115615599575f80fd5b60208301915083602082850101111561540d575f80fd5b5f805f805f808688036101208112156155c7575f80fd5b60a08112156155d4575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff808211156155f9575f80fd5b6156058a838b01615522565b955060e089013591508082111561561a575f80fd5b6156268a838b01615522565b945061010089013591508082111561563c575f80fd5b5061564989828a01615572565b979a9699509497509295939492505050565b5f806020838503121561566c575f80fd5b823567ffffffffffffffff811115615682575f80fd5b61568e858286016153cc565b90969095509350505050565b5f805f604084860312156156ac575f80fd5b833567ffffffffffffffff8111156156c2575f80fd5b6156ce86828701615572565b909790965060209590950135949350505050565b600181811c908216806156f657607f821691505b60208210810361572d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff81811683821601908082111561578157615781615733565b5092915050565b808202811582820484141761528157615281615733565b67ffffffffffffffff82811682821603908082111561578157615781615733565b5f67ffffffffffffffff8083168181036157dc576157dc615733565b6001019392505050565b5f602082840312156157f6575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82615838576158386157fd565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261589c575f80fd5b9190910192915050565b5f606082360312156158b6575f80fd5b6040516060810167ffffffffffffffff82821081831117156158da576158da615464565b8160405284359150808211156158ee575f80fd5b50830136601f8201126158ff575f80fd5b61590e36823560208401615491565b8252506020830135602082015261592760408401615210565b604082015292915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361596257615962615733565b5060010190565b8181038181111561528157615281615733565b601f821115614dc0575f81815260208120601f850160051c810160208610156159a25750805b601f850160051c820191505b818110156159c1578281556001016159ae565b505050505050565b815167ffffffffffffffff8111156159e3576159e3615464565b6159f7816159f184546156e2565b8461597c565b602080601f831160018114615a49575f8415615a135750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159c1565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615a9557888601518255948401946001909101908401615a76565b5085821015615ad157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b55606083018486615ae1565b9695505050505050565b8082018082111561528157615281615733565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b55606083018486615ae1565b5f825161589c81846020870161516b565b5f82615bd557615bd56157fd565b500690565b6103208101610300808584378201835f5b6001811015615c0a578151835260209283019290910190600101615beb565b5050509392505050565b5f60208284031215615c24575f80fd5b815180151581146151e8575f80fd5b5f67ffffffffffffffff80841680615c4d57615c4d6157fd565b9216919091049291505056fea2646970667358221220c1bba2a12efe116e21597e182ae83c49767a70ff696b4c924eaa8a3e168619fc64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106103a9575f3560e01c80638c3d7301116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063ada8f9191161018a578063b6b0b0971161015a578063b6b0b09714610891578063ba58ae39146108b8578063c00e0dc9146108cb578063c0ed84e0146108de575f80fd5b8063ada8f919146107c3578063adc879e9146107d6578063afd23cbe146107fd578063b4d63f581461082b575f80fd5b80639aa972a3116101c55780639aa972a3146107635780639c9f3dfe14610776578063a066215c14610789578063a3c573eb1461079c575f80fd5b80638c3d7301146107355780638da5cb5b1461073d57806399f5634e1461075b575f80fd5b80634a1a89a7116102d65780636b8616ce1161026b5780637fcb36531161023b5780637fcb365314610656578063831c7ead1461066a578063837a473814610691578063841b24d714610705575f80fd5b80636b8616ce146106095780636ff512cc14610628578063715018a61461063b5780637215541a14610643575f80fd5b8063542028d5116102a6578063542028d5146105de5780635ec91958146105e657806360469169146105ee578063621dd411146105f6575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b80632a9f208f1161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b80632a9f208f146104af5780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e514610416578063220d78991461042b578063267822471461043e5780632987898314610483575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db91906151d6565b606f546104069060ff1681565b60405190151581526020016103db565b6104296104243660046151ef565b610b43565b005b6103ec610439366004615227565b610c5b565b607b5461045e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b60745461045e9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6073546103c69067ffffffffffffffff1681565b6104296104d1366004615287565b610e31565b6104296104e43660046152eb565b610ffb565b6104066104f7366004615360565b611203565b61042961050a366004615360565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b610429610599366004615360565b6113dc565b6104296105ac366004615360565b61148f565b6105d06105bf366004615360565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b610429611620565b6105d061171f565b610429610604366004615287565b611734565b6105d0610617366004615360565b60716020525f908152604090205481565b61042961063636600461539c565b611ab2565b610429611b87565b610429610651366004615360565b611b9a565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106d961069f3660046153b5565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429611d07565b60335473ffffffffffffffffffffffffffffffffffffffff1661045e565b6105d0611dd3565b6104296107713660046152eb565b611f26565b610429610784366004615360565b611fd6565b610429610797366004615360565b612152565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104296107d136600461539c565b612258565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f54610818906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61086b610839366004615360565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104066108c63660046153b5565b61231c565b6104296108d9366004615414565b6123a4565b6103c6612b58565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429610920366004615540565b612bab565b606f5461045e906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155b0565b612c38565b61042961099c36600461565b565b61317b565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b610429613717565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b610429610a3636600461569a565b6137eb565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a7636600461539c565b613bdb565b610429610a8936600461539c565b613cad565b607a5461045e9073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac4906156e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610af0906156e2565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d058461231c565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613d61565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110678787878787878761411c565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f90815260786020526040812054909242926112469270010000000000000000000000000000000090920481169116615760565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161454b565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac4906156e2565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611671576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff166116cd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f607054606461172f9190615788565b905090565b606f5460ff1615611771576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f9081526072602052604090206001015442926117bd92780100000000000000000000000000000000000000000000000090910481169116615760565b67ffffffffffffffff1611156117ff576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861180c868661579f565b67ffffffffffffffff16111561184e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185c868686868686613d61565b61186584614758565b607954700100000000000000000000000000000000900467ffffffffffffffff165f036119a657607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f908152607560205260409020839055607954161561190657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561198b575f80fd5b505af115801561199d573d5f803e3d5ffd5b50505050611a74565b6119ae614932565b6079805467ffffffffffffffff16905f6119c7836157c0565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611b03576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b611b8f6149e1565b611b985f614a62565b565b60335473ffffffffffffffffffffffffffffffffffffffff163314611cff575f611bc2612b58565b90508067ffffffffffffffff168267ffffffffffffffff1611611c11576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180611c56575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15611c8d576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f908152607260205260409020600101544291611cbb9162093a809116615760565b67ffffffffffffffff161115611cfd576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614ad8565b607b5473ffffffffffffffffffffffffffffffffffffffff163314611d58576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611e5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8391906157e6565b90505f611e8e612b58565b60735467ffffffffffffffff680100000000000000008204811691611ee6917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661579f565b611ef09190615760565b611efa919061579f565b67ffffffffffffffff169050805f03611f15575f9250505090565b611f1f818361582a565b9250505090565b606f5460ff1615611f63576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f728787878787878761411c565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611fcd614ad8565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612027576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561206e576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120d55760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106120d5576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156121ea576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612353575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612374575067ffffffff00000001608083901c67ffffffffffffffff16105b801561238b575067ffffffff0000000160c083901c105b1561239857506001919050565b505f919050565b919050565b606f5460ff16156123e1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612441576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361247c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156124b8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561251d575f80fd5b505af115801561252f573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561259d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c191906157e6565b60735467ffffffffffffffff68010000000000000000820481165f818152607260205260408120549495504294919370010000000000000000000000000000000090049092169182905b87811015612917575f8b8b838181106126265761262661583d565b9050602002810190612638919061586a565b612641906158a6565b8051805160209091012060408201519192509067ffffffffffffffff1615612832578561266d816157c0565b9650505f81836020015184604001516040516020016126c493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526071909352912054909150811461274c576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015181519384018a905290830185905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120955060715f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612902565b8151516201d4c01015612871576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018b905260c08a901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c820152609d016040516020818303038152906040528051906020012094505b5050808061290f90615932565b91505061260b565b506129228785615760565b60735490945067ffffffffffffffff78010000000000000000000000000000000000000000000000009091048116908416111561298b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060810182528381524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528b86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217948416830294909417905582547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169302929092179055879082811690851614612abd57612a5f828561579f565b612a739067ffffffffffffffff1682615969565b607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff88160217905590505b612b0f333083607054612ad09190615788565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614b5b565b612b17614932565b60405167ffffffffffffffff8616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a25050505050505050505050565b6079545f9067ffffffffffffffff1615612b9a575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612bfc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c0882826159c9565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c5091906151d6565b5f54610100900460ff1615808015612c5657505f54600160ff909116105b80612c6f5750303b158015612c6f57505f5460ff166001145b612d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612d5c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612d69602088018861539c565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612dbe604088016020890161539c565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e23608088016060890161539c565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ead86826159c9565b506077612eba85826159c9565b5062093a80612ecf6060890160408a01615360565b67ffffffffffffffff161115612f11576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f216060880160408901615360565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612f8360a0890160808a01615360565b67ffffffffffffffff161115612fc5576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fd560a0880160808901615360565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130b4614c3d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f000000000000000000000000000000000000000000000000000000000000000085856040516131099493929190615b28565b60405180910390a18015611fcd575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156131d8576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613215576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613250576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561328c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916132d7918491700100000000000000000000000000000000900416615b5f565b111561330f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135de575f87878381811061336d5761336d61583d565b905060200281019061337f919061586a565b613388906158a6565b905083613394816157c0565b825180516020918201208185015160408087015190519499509194505f936133f59386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f9081526071909352912054909150811461347d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134a1600189615969565b84036135105742607b60149054906101000a900467ffffffffffffffff1684604001516134ce9190615760565b67ffffffffffffffff161115613510576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083810151604080860151815193840189905290830185905260608084019290925260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120945050505080806135d690615932565b915050613352565b506135e98484615760565b6040805160608101825283815267ffffffffffffffff428116602080840191825260738054680100000000000000009081900485168688019081528589165f8181526072909552888520975188559451600190970180549151871683027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921697871697909717179095558054938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958402959095167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9094169390931793909317909155915192955090917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613768576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156137cd575f80fd5b505af11580156137df573d5f803e3d5ffd5b50505050611b98614cdc565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613848576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613885576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61388e61171f565b9050818111156138ca576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115613906576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61394873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614b5b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139d691906157e6565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a10836157c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a47929190615b72565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613b75576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613bd4565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613bcb9493929190615b81565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cb56149e1565b73ffffffffffffffffffffffffffffffffffffffff8116613d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612cf7565b61148c81614a62565b5f80613d6b612b58565b905067ffffffffffffffff881615613e3a5760795467ffffffffffffffff9081169089161115613dc7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e34576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613eda565b67ffffffffffffffff87165f90815260756020526040902054915081613e8c576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613eda576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f27576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f358888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613f699190615bb6565b602060405180830381855afa158015613f84573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613fa791906157e6565b613fb19190615bc7565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161403391899190600401615bda565b602060405180830381865afa15801561404e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140729190615c14565b6140a8576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614110336140b6858b61579f565b67ffffffffffffffff166140c8611dd3565b6140d29190615788565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614d6a565b50505050505050505050565b5f67ffffffffffffffff8816156141e85760795467ffffffffffffffff9081169089161115614177576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f9081526078602052604090206002810154815490928881166801000000000000000090920416146141e2576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614283565b5067ffffffffffffffff85165f9081526075602052604090205480614239576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115614283576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142b557508767ffffffffffffffff168767ffffffffffffffff1611155b806142dc575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614313576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614614375576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143838787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143b79190615bb6565b602060405180830381855afa1580156143d2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143f591906157e6565b6143ff9190615bc7565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161448191889190600401615bda565b602060405180830381865afa15801561449c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144c09190615c14565b6144f6576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614110576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614585575060795467ffffffffffffffff908116908216115b156145bc576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b1580156146ea575f80fd5b505af11580156146fc573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161474b91815260200190565b60405180910390a3505050565b5f614761612b58565b9050815f80614770848461579f565b606f5467ffffffffffffffff91821692505f916147939161010090041642615969565b90505b8467ffffffffffffffff168467ffffffffffffffff161461481d5767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156147fb57600181015468010000000000000000900467ffffffffffffffff169450614817565b614805868661579f565b67ffffffffffffffff1693505061481d565b50614796565b5f6148288484615969565b90508381101561487f57808403600c81116148435780614846565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614875576148756157fd565b04607055506148ee565b838103600c81116148905780614893565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816148c9576148c96157fd565b04905080607054670de0b6b3a764000002816148e7576148e76157fd565b0460705550505b683635c9adc5dea00000607054111561491357683635c9adc5dea00000607055611fcd565b633b9aca006070541015611fcd57633b9aca0060705550505050505050565b60795467ffffffffffffffff680100000000000000008204811691161115611b98576079545f9061497a9068010000000000000000900467ffffffffffffffff166001615760565b905061498581611203565b1561148c576079545f906002906149a790849067ffffffffffffffff1661579f565b6149b19190615c33565b6149bb9083615760565b90506149c681611203565b156149d8576149d48161454b565b5050565b6149d48261454b565b60335473ffffffffffffffffffffffffffffffffffffffff163314611b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612cf7565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614b3d575f80fd5b505af1158015614b4f573d5f803e3d5ffd5b50505050611b98614dc5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052614c379085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e57565b50505050565b5f54610100900460ff16614cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612cf7565b611b9833614a62565b606f5460ff16614d18576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614dc09084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401614bb5565b505050565b606f5460ff1615614e02576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f614eb8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614f629092919063ffffffff16565b805190915015614dc05780806020019051810190614ed69190615c14565b614dc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612cf7565b6060614f7084845f85614f78565b949350505050565b60608247101561500a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612cf7565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150329190615bb6565b5f6040518083038185875af1925050503d805f811461506c576040519150601f19603f3d011682016040523d82523d5f602084013e615071565b606091505b50915091506150828783838761508d565b979650505050505050565b606083156151225782515f0361511b5773ffffffffffffffffffffffffffffffffffffffff85163b61511b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612cf7565b5081614f70565b614f7083838151156151375781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf791906151d6565b5f5b8381101561518557818101518382015260200161516d565b50505f910152565b5f81518084526151a481602086016020860161516b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6151e8602083018461518d565b9392505050565b5f602082840312156151ff575f80fd5b813561ffff811681146151e8575f80fd5b803567ffffffffffffffff8116811461239f575f80fd5b5f805f805f60a0868803121561523b575f80fd5b61524486615210565b945061525260208701615210565b94979496505050506040830135926060810135926080909101359150565b806103008101831015615281575f80fd5b92915050565b5f805f805f806103a0878903121561529d575f80fd5b6152a687615210565b95506152b460208801615210565b94506152c260408801615210565b935060608701359250608087013591506152df8860a08901615270565b90509295509295509295565b5f805f805f805f6103c0888a031215615302575f80fd5b61530b88615210565b965061531960208901615210565b955061532760408901615210565b945061533560608901615210565b93506080880135925060a088013591506153528960c08a01615270565b905092959891949750929550565b5f60208284031215615370575f80fd5b6151e882615210565b803573ffffffffffffffffffffffffffffffffffffffff8116811461239f575f80fd5b5f602082840312156153ac575f80fd5b6151e882615379565b5f602082840312156153c5575f80fd5b5035919050565b5f8083601f8401126153dc575f80fd5b50813567ffffffffffffffff8111156153f3575f80fd5b6020830191508360208260051b850101111561540d575f80fd5b9250929050565b5f805f60408486031215615426575f80fd5b833567ffffffffffffffff81111561543c575f80fd5b615448868287016153cc565b909450925061545b905060208501615379565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f67ffffffffffffffff808411156154ab576154ab615464565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156154f1576154f1615464565b81604052809350858152868686011115615509575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f830112615531575f80fd5b6151e883833560208501615491565b5f60208284031215615550575f80fd5b813567ffffffffffffffff811115615566575f80fd5b614f7084828501615522565b5f8083601f840112615582575f80fd5b50813567ffffffffffffffff811115615599575f80fd5b60208301915083602082850101111561540d575f80fd5b5f805f805f808688036101208112156155c7575f80fd5b60a08112156155d4575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff808211156155f9575f80fd5b6156058a838b01615522565b955060e089013591508082111561561a575f80fd5b6156268a838b01615522565b945061010089013591508082111561563c575f80fd5b5061564989828a01615572565b979a9699509497509295939492505050565b5f806020838503121561566c575f80fd5b823567ffffffffffffffff811115615682575f80fd5b61568e858286016153cc565b90969095509350505050565b5f805f604084860312156156ac575f80fd5b833567ffffffffffffffff8111156156c2575f80fd5b6156ce86828701615572565b909790965060209590950135949350505050565b600181811c908216806156f657607f821691505b60208210810361572d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff81811683821601908082111561578157615781615733565b5092915050565b808202811582820484141761528157615281615733565b67ffffffffffffffff82811682821603908082111561578157615781615733565b5f67ffffffffffffffff8083168181036157dc576157dc615733565b6001019392505050565b5f602082840312156157f6575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82615838576158386157fd565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261589c575f80fd5b9190910192915050565b5f606082360312156158b6575f80fd5b6040516060810167ffffffffffffffff82821081831117156158da576158da615464565b8160405284359150808211156158ee575f80fd5b50830136601f8201126158ff575f80fd5b61590e36823560208401615491565b8252506020830135602082015261592760408401615210565b604082015292915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361596257615962615733565b5060010190565b8181038181111561528157615281615733565b601f821115614dc0575f81815260208120601f850160051c810160208610156159a25750805b601f850160051c820191505b818110156159c1578281556001016159ae565b505050505050565b815167ffffffffffffffff8111156159e3576159e3615464565b6159f7816159f184546156e2565b8461597c565b602080601f831160018114615a49575f8415615a135750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159c1565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615a9557888601518255948401946001909101908401615a76565b5085821015615ad157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b55606083018486615ae1565b9695505050505050565b8082018082111561528157615281615733565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b55606083018486615ae1565b5f825161589c81846020870161516b565b5f82615bd557615bd56157fd565b500690565b6103208101610300808584378201835f5b6001811015615c0a578151835260209283019290910190600101615beb565b5050509392505050565b5f60208284031215615c24575f80fd5b815180151581146151e8575f80fd5b5f67ffffffffffffffff80841680615c4d57615c4d6157fd565b9216919091049291505056fea2646970667358221220c1bba2a12efe116e21597e182ae83c49767a70ff696b4c924eaa8a3e168619fc64736f6c63430008140033", + "bytecode": "0x61014060405234801562000011575f80fd5b5060405162005f6438038062005f648339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051615d74620001f05f395f818161068201528181610dd3015261311d01525f81816107ee0152610da901525f81816107b401528181611d60015281816137ae0152614c0001525f818161095901528181610f45015281816111100152818161196d0152818161212e0152818161398f01526146d801525f8181610a0601528181614041015261448f01525f81816108a901528181611d2e0152818161261301528181613964015261412d0152615d745ff3fe608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea2646970667358221220a50e6fa85418d984e88c8f7daf5faf4ee5e483c8bc96c6d92f33fe24b3cf94f764736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea2646970667358221220a50e6fa85418d984e88c8f7daf5faf4ee5e483c8bc96c6d92f33fe24b3cf94f764736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMBridge.json b/compiled-contracts/PolygonZkEVMBridge.json index 90d83ac59..a0d57e458 100644 --- a/compiled-contracts/PolygonZkEVMBridge.json +++ b/compiled-contracts/PolygonZkEVMBridge.json @@ -304,35 +304,6 @@ "stateMutability": "payable", "type": "function" }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "leafHash", - "type": "bytes32" - }, - { - "internalType": "bytes32[32]", - "name": "smtProof", - "type": "bytes32[32]" - }, - { - "internalType": "uint32", - "name": "index", - "type": "uint32" - } - ], - "name": "calculateRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "pure", - "type": "function" - }, { "inputs": [ { @@ -488,6 +459,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getDepositRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -537,19 +521,6 @@ "stateMutability": "pure", "type": "function" }, - { - "inputs": [], - "name": "getRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -805,8 +776,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b50615c738061001d5f395ff3fe608060405260043610620001a3575f3560e01c806379e2cf9711620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200064a578063ee25560b1462000661578063fb5708341462000690575f80fd5b8063be5831c714620005c1578063cd58657914620005fc578063d02103ca1462000613575f80fd5b80639e34070f11620000ba5780639e34070f1462000521578063aaa13cc21462000564578063bab161bf1462000588575f80fd5b806379e2cf9714620004a157806381b1c17414620004b857806383f2440314620004fd575f80fd5b80632dfdf0b5116200014a5780633e19704311620001225780633e19704314620003745780635ca1e1651462000466578063647c576c146200047d575f80fd5b80632dfdf0b51462000299578063318aee3d14620002bf57806334ac9cf21462000346575f80fd5b8063240ff378116200017e578063240ff378146200023a5780632cffd02e14620002515780632d2c9d941462000275575f80fd5b806315064c9614620001a75780632072f6c514620001d757806322e95f2c14620001f0575b5f80fd5b348015620001b3575f80fd5b50606854620001c29060ff1681565b60405190151581526020015b60405180910390f35b348015620001e3575f80fd5b50620001ee620006b4565b005b348015620001fc575f80fd5b50620002146200020e36600462003352565b62000712565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001ce565b620001ee6200024b366004620033e2565b620007b4565b3480156200025d575f80fd5b50620001ee6200026f36600462003473565b620009db565b34801562000281575f80fd5b50620001ee6200029336600462003473565b62000f60565b348015620002a5575f80fd5b50620002b060535481565b604051908152602001620001ce565b348015620002cb575f80fd5b5062000314620002dd36600462003551565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001ce565b34801562000352575f80fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000380575f80fd5b50620002b06200039236600462003585565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50620002b062001160565b34801562000489575f80fd5b50620001ee6200049b3660046200360a565b62001245565b348015620004ad575f80fd5b50620001ee6200148e565b348015620004c4575f80fd5b5062000214620004d636600462003657565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000509575f80fd5b50620002b06200051b3660046200366f565b620014c8565b3480156200052d575f80fd5b50620001c26200053f36600462003657565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000570575f80fd5b506200021462000582366004620036b0565b620015ab565b34801562000594575f80fd5b50606854620005ab90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001ce565b348015620005cd575f80fd5b50606854620005ab90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ee6200060d3660046200375d565b62001795565b3480156200061f575f80fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000656575f80fd5b50620001ee62001ce7565b3480156200066d575f80fd5b50620002b06200067f36600462003657565b60696020525f908152604090205481565b3480156200069c575f80fd5b50620001c2620006ae366004620037f9565b62001d43565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462000706576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200071062001e2b565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007f2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008185750600263ffffffff861610155b1562000850576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008a6999897969594939291906200388a565b60405180910390a1620009c3620009bd6001606860019054906101000a900463ffffffff16338989348989604051620008e192919062003904565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001ebe565b8215620009d457620009d462001fd2565b5050505050565b60685460ff161562000a19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a2f8b8b8b8b8b8b8b8b8b8b8b5f620020a2565b73ffffffffffffffffffffffffffffffffffffffff861662000b0757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a83919062003964565b5f6040518083038185875af1925050503d805f811462000abf576040519150601f19603f3d011682016040523d82523d5f602084013e62000ac4565b606091505b505090508062000b00576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000ee8565b60685463ffffffff61010090910481169088160362000b495762000b4373ffffffffffffffffffffffffffffffffffffffff871685856200228d565b62000ee8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e5f575f808062000c1b8688018862003a73565b9250925092505f8584848460405162000c34906200330b565b62000c429392919062003b2f565b8190604051809103905ff590508015801562000c60573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000cd3575f80fd5b505af115801562000ce6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e4d95949392919062003b6b565b60405180910390a15050505062000ee5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000ecd575f80fd5b505af115801562000ee0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f9e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fb58b8b8b8b8b8b8b8b8b8b8b6001620020a2565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fe7949392919062003bb2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200106a919062003964565b5f6040518083038185875af1925050503d805f8114620010a6576040519150601f19603f3d011682016040523d82523d5f602084013e620010ab565b606091505b5050905080620010e7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200123c578083901c600116600103620011cd576033816020811062001199576200119962003bf9565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011fa565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012339062003c53565b9150506200116a565b50919392505050565b5f54610100900460ff16158080156200126457505f54600160ff909116105b806200127f5750303b1580156200127f57505f5460ff166001145b62001311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200136e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556200142562002363565b801562001488575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000710576200071062001fd2565b5f83815b6020811015620015a257600163ffffffff8516821c811690036200153e57848160208110620014ff57620014ff62003bf9565b60200201358260405160200162001520929190918252602082015260400190565b6040516020818303038152906040528051906020012091506200158d565b8185826020811062001554576200155462003bf9565b602002013560405160200162001574929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80620015998162003c53565b915050620014cc565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200163f906200330b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526200168a908d908d908d908d908d9060200162003c8d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620016c8929160200162003ccd565b604051602081830303815290604052805190602001206040516020016200175194939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620017d3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620017dd62002405565b60685463ffffffff888116610100909204161480620018035750600263ffffffff881610155b156200183b576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200189f5788341462001896576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001b8c565b3415620018d8576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620019c1576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001997575f80fd5b505af1158015620019aa573d5f803e3d5ffd5b5050505080602001519450805f0151935062001b8a565b8515620019d657620019d6898b89896200247a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562001a41573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a67919062003cff565b905062001a8d73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200298d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001af8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001b1e919062003cff565b905062001b2c828262003d17565b6068548c9850610100900463ffffffff169650935062001b4c87620029ed565b62001b578c62002b01565b62001b628d62002c0a565b60405160200162001b769392919062003b2f565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001bcd98979695949392919062003d2d565b60405180910390a162001cbf620009bd5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001cd05762001cd062001fd2565b5050505062001cde60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001d39576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200071062002d08565b5f84815b602081101562001e1d57600163ffffffff8616821c8116900362001db95785816020811062001d7a5762001d7a62003bf9565b60200201358260405160200162001d9b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001e08565b8186826020811062001dcf5762001dcf62003bf9565b602002013560405160200162001def929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001e148162003c53565b91505062001d47565b50821490505b949350505050565b60685460ff161562001e69576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001ecf6020600262003edc565b62001edb919062003d17565b6053541062001f16576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001f279062003c53565b918290555090505f5b602081101562001fc2578082901c60011660010362001f6857826033826020811062001f605762001f6062003bf9565b015550505050565b6033816020811062001f7e5762001f7e62003bf9565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001fb99062003c53565b91505062001f30565b5062001fcd62003ee9565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d6200205862001160565b6040518263ffffffff1660e01b81526004016200207791815260200190565b5f604051808303815f87803b1580156200208f575f80fd5b505af115801562001488573d5f803e3d5ffd5b620020b38b63ffffffff1662002d97565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562002152573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002178919062003cff565b9050805f03620021b3576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620021fd576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff166200221a5750896200221d565b508a5b620022466200223d848c8c8c8c8c8c8c604051620008e192919062003904565b8f8f8462001d43565b6200227d576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001fcd9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002dfb565b5f54610100900460ff16620023fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001308565b6200071062002f0d565b60026001540362002473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001308565b6002600155565b5f6200248a600482848662003f16565b620024959162003f3f565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016200270f575f808080808080620024f7896004818d62003f16565b81019062002506919062003f88565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146200257a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620025ca576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002604576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026bf919062003964565b5f604051808303815f865af19150503d805f8114620026fa576040519150601f19603f3d011682016040523d82523d5f602084013e620026ff565b606091505b50505050505050505050620009d4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c00000000000000000000000000000000000000000000000000000000146200278b576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620027a28a6004818e62003f16565b810190620027b1919062003fde565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002827576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002877576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f16916200293b919062003964565b5f604051808303815f865af19150503d805f811462002976576040519150601f19603f3d011682016040523d82523d5f602084013e6200297b565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014889085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620022e0565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a70919062003964565b5f60405180830381855afa9150503d805f811462002aaa576040519150601f19603f3d011682016040523d82523d5f602084013e62002aaf565b606091505b50915091508162002af6576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001e23565b62001e238162002fa5565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002b84919062003964565b5f60405180830381855afa9150503d805f811462002bbe576040519150601f19603f3d011682016040523d82523d5f602084013e62002bc3565b606091505b50915091508162002af6576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001e23565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c8c919062003964565b5f60405180830381855afa9150503d805f811462002cc6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ccb565b606091505b509150915081801562002cdf575080516020145b62002cec57601262001e23565b8080602001905181019062001e23919062004065565b60018055565b60685460ff1662002d45576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009d4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002e5e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031909092919063ffffffff16565b80519091501562001fcd578080602001905181019062002e7f919062004083565b62001fcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001308565b5f54610100900460ff1662002d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001308565b6060604082511062002fc75781806020019051810190620007ae9190620040a1565b815160200362003152575f5b6020811080156200301e575082818151811062002ff45762002ff462003bf9565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620030395780620030308162003c53565b91505062002fd3565b805f036200307c57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562003099576200309962003913565b6040519080825280601f01601f191660200182016040528015620030c4576020820181803683370190505b5090505f5b828110156200314a57848181518110620030e757620030e762003bf9565b602001015160f81c60f81b82828151811062003107576200310762003bf9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620031418162003c53565b915050620030c9565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001e2384845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620031c5919062003964565b5f6040518083038185875af1925050503d805f811462003201576040519150601f19603f3d011682016040523d82523d5f602084013e62003206565b606091505b5091509150620032198783838762003224565b979650505050505050565b60608315620032be5782515f03620032b65773ffffffffffffffffffffffffffffffffffffffff85163b620032b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001308565b508162001e23565b62001e238383815115620032d55781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200130891906200411c565b611b0d806200413183390190565b803563ffffffff811681146200318b575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200334f575f80fd5b50565b5f806040838503121562003364575f80fd5b6200336f8362003319565b9150602083013562003381816200332d565b809150509250929050565b80151581146200334f575f80fd5b5f8083601f840112620033ab575f80fd5b50813567ffffffffffffffff811115620033c3575f80fd5b602083019150836020828501011115620033db575f80fd5b9250929050565b5f805f805f60808688031215620033f7575f80fd5b620034028662003319565b9450602086013562003414816200332d565b9350604086013562003426816200338c565b9250606086013567ffffffffffffffff81111562003442575f80fd5b62003450888289016200339a565b969995985093965092949392505050565b806104008101831015620007ae575f80fd5b5f805f805f805f805f805f6105208c8e0312156200348f575f80fd5b6200349b8d8d62003461565b9a50620034ac6104008d0162003319565b99506104208c013598506104408c01359750620034cd6104608d0162003319565b96506104808c0135620034e0816200332d565b9550620034f16104a08d0162003319565b94506104c08c013562003504816200332d565b93506104e08c013592506105008c013567ffffffffffffffff81111562003529575f80fd5b620035378e828f016200339a565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003562575f80fd5b81356200356f816200332d565b9392505050565b60ff811681146200334f575f80fd5b5f805f805f805f60e0888a0312156200359c575f80fd5b8735620035a98162003576565b9650620035b96020890162003319565b95506040880135620035cb816200332d565b9450620035db6060890162003319565b93506080880135620035ed816200332d565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200361d575f80fd5b620036288462003319565b925060208401356200363a816200332d565b915060408401356200364c816200332d565b809150509250925092565b5f6020828403121562003668575f80fd5b5035919050565b5f805f610440848603121562003683575f80fd5b8335925062003696856020860162003461565b9150620036a7610420850162003319565b90509250925092565b5f805f805f805f60a0888a031215620036c7575f80fd5b620036d28862003319565b96506020880135620036e4816200332d565b9550604088013567ffffffffffffffff8082111562003701575f80fd5b6200370f8b838c016200339a565b909750955060608a013591508082111562003728575f80fd5b50620037378a828b016200339a565b90945092505060808801356200374d8162003576565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003774575f80fd5b6200377f8862003319565b9650602088013562003791816200332d565b9550604088013594506060880135620037aa816200332d565b93506080880135620037bc816200338c565b925060a088013567ffffffffffffffff811115620037d8575f80fd5b620037e68a828b016200339a565b989b979a50959850939692959293505050565b5f805f8061046085870312156200380e575f80fd5b8435935062003821866020870162003461565b925062003832610420860162003319565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038ea828501878962003843565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b838110156200395c57818101518382015260200162003942565b50505f910152565b5f82516200397781846020870162003940565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620039cb57620039cb62003913565b604052919050565b5f67ffffffffffffffff821115620039ef57620039ef62003913565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003a2b575f80fd5b813562003a4262003a3c82620039d3565b62003981565b81815284602083860101111562003a57575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003a86575f80fd5b833567ffffffffffffffff8082111562003a9e575f80fd5b62003aac8783880162003a1b565b9450602086013591508082111562003ac2575f80fd5b5062003ad18682870162003a1b565b92505060408401356200364c8162003576565b5f815180845262003afd81602086016020860162003940565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003b43606083018662003ae4565b828103602084015262003b57818662003ae4565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200321960808301848662003843565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003bef60608301848662003843565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c865762003c8662003c26565b5060010190565b606081525f62003ca260608301878962003843565b828103602084015262003cb781868862003843565b91505060ff831660408301529695505050505050565b5f835162003ce081846020880162003940565b83519083019062003cf681836020880162003940565b01949350505050565b5f6020828403121562003d10575f80fd5b5051919050565b81810381811115620007ae57620007ae62003c26565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d8c8285018762003ae4565b925080851660e085015250509998505050505050505050565b600181815b8085111562003e0457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003de85762003de862003c26565b8085161562003df657918102915b93841c939080029062003daa565b509250929050565b5f8262003e1c57506001620007ae565b8162003e2a57505f620007ae565b816001811462003e43576002811462003e4e5762003e6e565b6001915050620007ae565b60ff84111562003e625762003e6262003c26565b50506001821b620007ae565b5060208310610133831016604e8410600b841016171562003e93575081810a620007ae565b62003e9f838362003da5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003ed45762003ed462003c26565b029392505050565b5f6200356f838362003e0c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003f25575f80fd5b8386111562003f32575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f805780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003f9f575f80fd5b873562003fac816200332d565b9650602088013562003fbe816200332d565b955060408801359450606088013593506080880135620035ed8162003576565b5f805f805f805f80610100898b03121562003ff7575f80fd5b883562004004816200332d565b9750602089013562004016816200332d565b96506040890135955060608901359450608089013562004036816200338c565b935060a0890135620040488162003576565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004076575f80fd5b81516200356f8162003576565b5f6020828403121562004094575f80fd5b81516200356f816200338c565b5f60208284031215620040b2575f80fd5b815167ffffffffffffffff811115620040c9575f80fd5b8201601f81018413620040da575f80fd5b8051620040eb62003a3c82620039d3565b81815285602083850101111562004100575f80fd5b6200411382602083016020860162003940565b95945050505050565b602081525f6200356f602083018462003ae456fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a264697066735822122004c06992f02d6f5a5fdf6dc9a47c64265ec78705a8b84bebf81be4b2edfc69c364736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001a3575f3560e01c806379e2cf9711620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200064a578063ee25560b1462000661578063fb5708341462000690575f80fd5b8063be5831c714620005c1578063cd58657914620005fc578063d02103ca1462000613575f80fd5b80639e34070f11620000ba5780639e34070f1462000521578063aaa13cc21462000564578063bab161bf1462000588575f80fd5b806379e2cf9714620004a157806381b1c17414620004b857806383f2440314620004fd575f80fd5b80632dfdf0b5116200014a5780633e19704311620001225780633e19704314620003745780635ca1e1651462000466578063647c576c146200047d575f80fd5b80632dfdf0b51462000299578063318aee3d14620002bf57806334ac9cf21462000346575f80fd5b8063240ff378116200017e578063240ff378146200023a5780632cffd02e14620002515780632d2c9d941462000275575f80fd5b806315064c9614620001a75780632072f6c514620001d757806322e95f2c14620001f0575b5f80fd5b348015620001b3575f80fd5b50606854620001c29060ff1681565b60405190151581526020015b60405180910390f35b348015620001e3575f80fd5b50620001ee620006b4565b005b348015620001fc575f80fd5b50620002146200020e36600462003352565b62000712565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001ce565b620001ee6200024b366004620033e2565b620007b4565b3480156200025d575f80fd5b50620001ee6200026f36600462003473565b620009db565b34801562000281575f80fd5b50620001ee6200029336600462003473565b62000f60565b348015620002a5575f80fd5b50620002b060535481565b604051908152602001620001ce565b348015620002cb575f80fd5b5062000314620002dd36600462003551565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001ce565b34801562000352575f80fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000380575f80fd5b50620002b06200039236600462003585565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50620002b062001160565b34801562000489575f80fd5b50620001ee6200049b3660046200360a565b62001245565b348015620004ad575f80fd5b50620001ee6200148e565b348015620004c4575f80fd5b5062000214620004d636600462003657565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000509575f80fd5b50620002b06200051b3660046200366f565b620014c8565b3480156200052d575f80fd5b50620001c26200053f36600462003657565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000570575f80fd5b506200021462000582366004620036b0565b620015ab565b34801562000594575f80fd5b50606854620005ab90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001ce565b348015620005cd575f80fd5b50606854620005ab90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ee6200060d3660046200375d565b62001795565b3480156200061f575f80fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000656575f80fd5b50620001ee62001ce7565b3480156200066d575f80fd5b50620002b06200067f36600462003657565b60696020525f908152604090205481565b3480156200069c575f80fd5b50620001c2620006ae366004620037f9565b62001d43565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462000706576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200071062001e2b565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007f2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008185750600263ffffffff861610155b1562000850576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008a6999897969594939291906200388a565b60405180910390a1620009c3620009bd6001606860019054906101000a900463ffffffff16338989348989604051620008e192919062003904565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001ebe565b8215620009d457620009d462001fd2565b5050505050565b60685460ff161562000a19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a2f8b8b8b8b8b8b8b8b8b8b8b5f620020a2565b73ffffffffffffffffffffffffffffffffffffffff861662000b0757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a83919062003964565b5f6040518083038185875af1925050503d805f811462000abf576040519150601f19603f3d011682016040523d82523d5f602084013e62000ac4565b606091505b505090508062000b00576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000ee8565b60685463ffffffff61010090910481169088160362000b495762000b4373ffffffffffffffffffffffffffffffffffffffff871685856200228d565b62000ee8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e5f575f808062000c1b8688018862003a73565b9250925092505f8584848460405162000c34906200330b565b62000c429392919062003b2f565b8190604051809103905ff590508015801562000c60573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000cd3575f80fd5b505af115801562000ce6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e4d95949392919062003b6b565b60405180910390a15050505062000ee5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000ecd575f80fd5b505af115801562000ee0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f9e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fb58b8b8b8b8b8b8b8b8b8b8b6001620020a2565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fe7949392919062003bb2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200106a919062003964565b5f6040518083038185875af1925050503d805f8114620010a6576040519150601f19603f3d011682016040523d82523d5f602084013e620010ab565b606091505b5050905080620010e7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200123c578083901c600116600103620011cd576033816020811062001199576200119962003bf9565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011fa565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012339062003c53565b9150506200116a565b50919392505050565b5f54610100900460ff16158080156200126457505f54600160ff909116105b806200127f5750303b1580156200127f57505f5460ff166001145b62001311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200136e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556200142562002363565b801562001488575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000710576200071062001fd2565b5f83815b6020811015620015a257600163ffffffff8516821c811690036200153e57848160208110620014ff57620014ff62003bf9565b60200201358260405160200162001520929190918252602082015260400190565b6040516020818303038152906040528051906020012091506200158d565b8185826020811062001554576200155462003bf9565b602002013560405160200162001574929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80620015998162003c53565b915050620014cc565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200163f906200330b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526200168a908d908d908d908d908d9060200162003c8d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620016c8929160200162003ccd565b604051602081830303815290604052805190602001206040516020016200175194939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620017d3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620017dd62002405565b60685463ffffffff888116610100909204161480620018035750600263ffffffff881610155b156200183b576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200189f5788341462001896576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001b8c565b3415620018d8576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620019c1576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001997575f80fd5b505af1158015620019aa573d5f803e3d5ffd5b5050505080602001519450805f0151935062001b8a565b8515620019d657620019d6898b89896200247a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562001a41573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a67919062003cff565b905062001a8d73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200298d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001af8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001b1e919062003cff565b905062001b2c828262003d17565b6068548c9850610100900463ffffffff169650935062001b4c87620029ed565b62001b578c62002b01565b62001b628d62002c0a565b60405160200162001b769392919062003b2f565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001bcd98979695949392919062003d2d565b60405180910390a162001cbf620009bd5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001cd05762001cd062001fd2565b5050505062001cde60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001d39576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200071062002d08565b5f84815b602081101562001e1d57600163ffffffff8616821c8116900362001db95785816020811062001d7a5762001d7a62003bf9565b60200201358260405160200162001d9b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001e08565b8186826020811062001dcf5762001dcf62003bf9565b602002013560405160200162001def929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001e148162003c53565b91505062001d47565b50821490505b949350505050565b60685460ff161562001e69576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001ecf6020600262003edc565b62001edb919062003d17565b6053541062001f16576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001f279062003c53565b918290555090505f5b602081101562001fc2578082901c60011660010362001f6857826033826020811062001f605762001f6062003bf9565b015550505050565b6033816020811062001f7e5762001f7e62003bf9565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001fb99062003c53565b91505062001f30565b5062001fcd62003ee9565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d6200205862001160565b6040518263ffffffff1660e01b81526004016200207791815260200190565b5f604051808303815f87803b1580156200208f575f80fd5b505af115801562001488573d5f803e3d5ffd5b620020b38b63ffffffff1662002d97565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562002152573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002178919062003cff565b9050805f03620021b3576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620021fd576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff166200221a5750896200221d565b508a5b620022466200223d848c8c8c8c8c8c8c604051620008e192919062003904565b8f8f8462001d43565b6200227d576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001fcd9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002dfb565b5f54610100900460ff16620023fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001308565b6200071062002f0d565b60026001540362002473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001308565b6002600155565b5f6200248a600482848662003f16565b620024959162003f3f565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016200270f575f808080808080620024f7896004818d62003f16565b81019062002506919062003f88565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146200257a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620025ca576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002604576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026bf919062003964565b5f604051808303815f865af19150503d805f8114620026fa576040519150601f19603f3d011682016040523d82523d5f602084013e620026ff565b606091505b50505050505050505050620009d4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c00000000000000000000000000000000000000000000000000000000146200278b576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620027a28a6004818e62003f16565b810190620027b1919062003fde565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002827576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002877576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f16916200293b919062003964565b5f604051808303815f865af19150503d805f811462002976576040519150601f19603f3d011682016040523d82523d5f602084013e6200297b565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014889085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620022e0565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a70919062003964565b5f60405180830381855afa9150503d805f811462002aaa576040519150601f19603f3d011682016040523d82523d5f602084013e62002aaf565b606091505b50915091508162002af6576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001e23565b62001e238162002fa5565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002b84919062003964565b5f60405180830381855afa9150503d805f811462002bbe576040519150601f19603f3d011682016040523d82523d5f602084013e62002bc3565b606091505b50915091508162002af6576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001e23565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c8c919062003964565b5f60405180830381855afa9150503d805f811462002cc6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ccb565b606091505b509150915081801562002cdf575080516020145b62002cec57601262001e23565b8080602001905181019062001e23919062004065565b60018055565b60685460ff1662002d45576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009d4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002e5e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031909092919063ffffffff16565b80519091501562001fcd578080602001905181019062002e7f919062004083565b62001fcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001308565b5f54610100900460ff1662002d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001308565b6060604082511062002fc75781806020019051810190620007ae9190620040a1565b815160200362003152575f5b6020811080156200301e575082818151811062002ff45762002ff462003bf9565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620030395780620030308162003c53565b91505062002fd3565b805f036200307c57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562003099576200309962003913565b6040519080825280601f01601f191660200182016040528015620030c4576020820181803683370190505b5090505f5b828110156200314a57848181518110620030e757620030e762003bf9565b602001015160f81c60f81b82828151811062003107576200310762003bf9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620031418162003c53565b915050620030c9565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001e2384845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620031c5919062003964565b5f6040518083038185875af1925050503d805f811462003201576040519150601f19603f3d011682016040523d82523d5f602084013e62003206565b606091505b5091509150620032198783838762003224565b979650505050505050565b60608315620032be5782515f03620032b65773ffffffffffffffffffffffffffffffffffffffff85163b620032b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001308565b508162001e23565b62001e238383815115620032d55781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200130891906200411c565b611b0d806200413183390190565b803563ffffffff811681146200318b575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200334f575f80fd5b50565b5f806040838503121562003364575f80fd5b6200336f8362003319565b9150602083013562003381816200332d565b809150509250929050565b80151581146200334f575f80fd5b5f8083601f840112620033ab575f80fd5b50813567ffffffffffffffff811115620033c3575f80fd5b602083019150836020828501011115620033db575f80fd5b9250929050565b5f805f805f60808688031215620033f7575f80fd5b620034028662003319565b9450602086013562003414816200332d565b9350604086013562003426816200338c565b9250606086013567ffffffffffffffff81111562003442575f80fd5b62003450888289016200339a565b969995985093965092949392505050565b806104008101831015620007ae575f80fd5b5f805f805f805f805f805f6105208c8e0312156200348f575f80fd5b6200349b8d8d62003461565b9a50620034ac6104008d0162003319565b99506104208c013598506104408c01359750620034cd6104608d0162003319565b96506104808c0135620034e0816200332d565b9550620034f16104a08d0162003319565b94506104c08c013562003504816200332d565b93506104e08c013592506105008c013567ffffffffffffffff81111562003529575f80fd5b620035378e828f016200339a565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003562575f80fd5b81356200356f816200332d565b9392505050565b60ff811681146200334f575f80fd5b5f805f805f805f60e0888a0312156200359c575f80fd5b8735620035a98162003576565b9650620035b96020890162003319565b95506040880135620035cb816200332d565b9450620035db6060890162003319565b93506080880135620035ed816200332d565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200361d575f80fd5b620036288462003319565b925060208401356200363a816200332d565b915060408401356200364c816200332d565b809150509250925092565b5f6020828403121562003668575f80fd5b5035919050565b5f805f610440848603121562003683575f80fd5b8335925062003696856020860162003461565b9150620036a7610420850162003319565b90509250925092565b5f805f805f805f60a0888a031215620036c7575f80fd5b620036d28862003319565b96506020880135620036e4816200332d565b9550604088013567ffffffffffffffff8082111562003701575f80fd5b6200370f8b838c016200339a565b909750955060608a013591508082111562003728575f80fd5b50620037378a828b016200339a565b90945092505060808801356200374d8162003576565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003774575f80fd5b6200377f8862003319565b9650602088013562003791816200332d565b9550604088013594506060880135620037aa816200332d565b93506080880135620037bc816200338c565b925060a088013567ffffffffffffffff811115620037d8575f80fd5b620037e68a828b016200339a565b989b979a50959850939692959293505050565b5f805f8061046085870312156200380e575f80fd5b8435935062003821866020870162003461565b925062003832610420860162003319565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038ea828501878962003843565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b838110156200395c57818101518382015260200162003942565b50505f910152565b5f82516200397781846020870162003940565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620039cb57620039cb62003913565b604052919050565b5f67ffffffffffffffff821115620039ef57620039ef62003913565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003a2b575f80fd5b813562003a4262003a3c82620039d3565b62003981565b81815284602083860101111562003a57575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003a86575f80fd5b833567ffffffffffffffff8082111562003a9e575f80fd5b62003aac8783880162003a1b565b9450602086013591508082111562003ac2575f80fd5b5062003ad18682870162003a1b565b92505060408401356200364c8162003576565b5f815180845262003afd81602086016020860162003940565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003b43606083018662003ae4565b828103602084015262003b57818662003ae4565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200321960808301848662003843565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003bef60608301848662003843565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c865762003c8662003c26565b5060010190565b606081525f62003ca260608301878962003843565b828103602084015262003cb781868862003843565b91505060ff831660408301529695505050505050565b5f835162003ce081846020880162003940565b83519083019062003cf681836020880162003940565b01949350505050565b5f6020828403121562003d10575f80fd5b5051919050565b81810381811115620007ae57620007ae62003c26565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d8c8285018762003ae4565b925080851660e085015250509998505050505050505050565b600181815b8085111562003e0457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003de85762003de862003c26565b8085161562003df657918102915b93841c939080029062003daa565b509250929050565b5f8262003e1c57506001620007ae565b8162003e2a57505f620007ae565b816001811462003e43576002811462003e4e5762003e6e565b6001915050620007ae565b60ff84111562003e625762003e6262003c26565b50506001821b620007ae565b5060208310610133831016604e8410600b841016171562003e93575081810a620007ae565b62003e9f838362003da5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003ed45762003ed462003c26565b029392505050565b5f6200356f838362003e0c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003f25575f80fd5b8386111562003f32575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f805780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003f9f575f80fd5b873562003fac816200332d565b9650602088013562003fbe816200332d565b955060408801359450606088013593506080880135620035ed8162003576565b5f805f805f805f80610100898b03121562003ff7575f80fd5b883562004004816200332d565b9750602089013562004016816200332d565b96506040890135955060608901359450608089013562004036816200338c565b935060a0890135620040488162003576565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004076575f80fd5b81516200356f8162003576565b5f6020828403121562004094575f80fd5b81516200356f816200338c565b5f60208284031215620040b2575f80fd5b815167ffffffffffffffff811115620040c9575f80fd5b8201601f81018413620040da575f80fd5b8051620040eb62003a3c82620039d3565b81815285602083850101111562004100575f80fd5b6200411382602083016020860162003940565b95945050505050565b602081525f6200356f602083018462003ae456fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a264697066735822122004c06992f02d6f5a5fdf6dc9a47c64265ec78705a8b84bebf81be4b2edfc69c364736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b50615b1f8061001d5f395ff3fe60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220dc5d0800b73601716987991121b7cb66e16dc8428f7ecac637fad0c9c06ca6ed64736f6c63430008140033", + "deployedBytecode": "0x60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220dc5d0800b73601716987991121b7cb66e16dc8428f7ecac637fad0c9c06ca6ed64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMBridgeMock.json b/compiled-contracts/PolygonZkEVMBridgeMock.json index 455a0b3d4..92344c1f0 100644 --- a/compiled-contracts/PolygonZkEVMBridgeMock.json +++ b/compiled-contracts/PolygonZkEVMBridgeMock.json @@ -323,35 +323,6 @@ "stateMutability": "payable", "type": "function" }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "leafHash", - "type": "bytes32" - }, - { - "internalType": "bytes32[32]", - "name": "smtProof", - "type": "bytes32[32]" - }, - { - "internalType": "uint32", - "name": "index", - "type": "uint32" - } - ], - "name": "calculateRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "pure", - "type": "function" - }, { "inputs": [ { @@ -507,6 +478,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getDepositRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -556,19 +540,6 @@ "stateMutability": "pure", "type": "function" }, - { - "inputs": [], - "name": "getRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -896,8 +867,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b506160888061001d5f395ff3fe608060405260043610620001eb575f3560e01c806379e2cf971162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000734578063ee25560b146200074b578063f2fde38b146200077a578063fb570834146200079e575f80fd5b8063bab161bf1462000672578063be5831c714620006ab578063cd58657914620006e6578063d02103ca14620006fd575f80fd5b80638da5cb5b11620000de5780638da5cb5b14620005c857806391e57e2d14620005f45780639e34070f146200060b578063aaa13cc2146200064e575f80fd5b806379e2cf97146200054857806381b1c174146200055f57806383f2440314620005a4575f80fd5b80632d2c9d9411620001865780633e19704311620001525780633e19704314620004045780635ca1e16514620004f6578063647c576c146200050d578063715018a61462000531575f80fd5b80632d2c9d9414620003055780632dfdf0b51462000329578063318aee3d146200034f57806334ac9cf214620003d6575f80fd5b8063240ff37811620001c6578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002bd5780632cffd02e14620002e1575f80fd5b806315064c9614620001ef5780632072f6c5146200021f57806322e95f2c1462000238575b5f80fd5b348015620001fb575f80fd5b506068546200020a9060ff1681565b60405190151581526020015b60405180910390f35b3480156200022b575f80fd5b5062000236620007c2565b005b34801562000244575f80fd5b506200025c620002563660046200374b565b62000820565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000216565b6200023662000293366004620037db565b620008c2565b348015620002a5575f80fd5b5062000236620002b73660046200385a565b62000ae9565b348015620002c9575f80fd5b5062000236620002db36600462003872565b62000af8565b348015620002ed575f80fd5b5062000236620002ff366004620038a7565b62000b3e565b34801562000311575f80fd5b506200023662000323366004620038a7565b620010c3565b34801562000335575f80fd5b506200034060535481565b60405190815260200162000216565b3480156200035b575f80fd5b50620003a46200036d36600462003985565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000216565b348015620003e2575f80fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000410575f80fd5b506200034062000422366004620039b2565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000502575f80fd5b5062000340620012c3565b34801562000519575f80fd5b50620002366200052b36600462003a37565b620013a8565b3480156200053d575f80fd5b5062000236620015fd565b34801562000554575f80fd5b506200023662001612565b3480156200056b575f80fd5b506200025c6200057d3660046200385a565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005b0575f80fd5b5062000340620005c236600462003a84565b6200164c565b348015620005d4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b34801562000600575f80fd5b506200034060d15481565b34801562000617575f80fd5b506200020a620006293660046200385a565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200065a575f80fd5b506200025c6200066c36600462003ac5565b6200172f565b3480156200067e575f80fd5b506068546200069590610100900463ffffffff1681565b60405163ffffffff909116815260200162000216565b348015620006b7575f80fd5b506068546200069590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000236620006f736600462003b72565b62001919565b34801562000709575f80fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000740575f80fd5b5062000236620019ed565b34801562000757575f80fd5b5062000340620007693660046200385a565b60696020525f908152604090205481565b34801562000786575f80fd5b50620002366200079836600462003985565b62001a49565b348015620007aa575f80fd5b506200020a620007bc36600462003c0e565b62001b06565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462000814576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081e62001bee565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff161562000900576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009265750600263ffffffff861610155b156200095e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009b49998979695949392919062003c9f565b60405180910390a162000ad162000acb6001606860019054906101000a900463ffffffff16338989348989604051620009ef92919062003d19565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001c81565b821562000ae25762000ae262001d95565b5050505050565b62000af362001e65565b60d155565b62000b0262001e65565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b7c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b928b8b8b8b8b8b8b8b8b8b8b5f62001ee8565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be6919062003d79565b5f6040518083038185875af1925050503d805f811462000c22576040519150601f19603f3d011682016040523d82523d5f602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200104b565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff87168585620020d3565b6200104b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fc2575f808062000d7e8688018862003e88565b9250925092505f8584848460405162000d979062003707565b62000da59392919062003f44565b8190604051809103905ff590508015801562000dc3573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e36575f80fd5b505af115801562000e49573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fb095949392919062003f80565b60405180910390a15050505062001048565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001030575f80fd5b505af115801562001043573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562001101576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011188b8b8b8b8b8b8b8b8b8b8b600162001ee8565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200114a949392919062003fc7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011cd919062003d79565b5f6040518083038185875af1925050503d805f811462001209576040519150601f19603f3d011682016040523d82523d5f602084013e6200120e565b606091505b50509050806200124a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200139f578083901c600116600103620013305760338160208110620012fc57620012fc6200400e565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200135d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013969062004068565b915050620012cd565b50919392505050565b5f54610100900460ff1615808015620013c757505f54600160ff909116105b80620013e25750303b158015620013e257505f5460ff166001145b62001474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014d1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d15562001594620021a9565b8015620015f7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200160762001e65565b6200081e5f62002247565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff1610156200081e576200081e62001d95565b5f83815b60208110156200172657600163ffffffff8516821c81169003620016c2578481602081106200168357620016836200400e565b602002013582604051602001620016a4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001711565b81858260208110620016d857620016d86200400e565b6020020135604051602001620016f8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806200171d8162004068565b91505062001650565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620017c39062003707565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526200180e908d908d908d908d908d90602001620040a2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526200184c9291602001620040e2565b60405160208183030381529060405280519060200120604051602001620018d594939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620019d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200146b565b620019e487878787878787620022bd565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001a3f576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081e62002806565b62001a5362001e65565b73ffffffffffffffffffffffffffffffffffffffff811662001af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200146b565b62001b038162002247565b50565b5f84815b602081101562001be057600163ffffffff8616821c8116900362001b7c5785816020811062001b3d5762001b3d6200400e565b60200201358260405160200162001b5e929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001bcb565b8186826020811062001b925762001b926200400e565b602002013560405160200162001bb2929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001bd78162004068565b91505062001b0a565b50821490505b949350505050565b60685460ff161562001c2c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001c92602060026200424b565b62001c9e919062004258565b6053541062001cd9576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001cea9062004068565b918290555090505f5b602081101562001d85578082901c60011660010362001d2b57826033826020811062001d235762001d236200400e565b015550505050565b6033816020811062001d415762001d416200400e565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001d7c9062004068565b91505062001cf3565b5062001d906200426e565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001e1b620012c3565b6040518263ffffffff1660e01b815260040162001e3a91815260200190565b5f604051808303815f87803b15801562001e52575f80fd5b505af1158015620015f7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff1633146200081e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200146b565b62001ef98b63ffffffff1662002895565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001f98573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001fbe91906200429b565b9050805f0362001ff9576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462002043576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff166200206057508962002063565b508a5b6200208c62002083848c8c8c8c8c8c8c604051620009ef92919062003d19565b8f8f8462001b06565b620020c3576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001d909084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620028f9565b5f54610100900460ff1662002241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200146b565b6200081e335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620022fb576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200230562002a0b565b60685463ffffffff8881166101009092041614806200232b5750600263ffffffff881610155b1562002363576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620023c757883414620023be576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620026b4565b341562002400576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620024e9576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620024bf575f80fd5b505af1158015620024d2573d5f803e3d5ffd5b5050505080602001519450805f01519350620026b2565b8515620024fe57620024fe898b898962002a80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002569573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200258f91906200429b565b9050620025b573ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f93565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002620573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200264691906200429b565b905062002654828262004258565b6068548c9850610100900463ffffffff1696509350620026748762002ff3565b6200267f8c62003107565b6200268a8d62003210565b6040516020016200269e9392919062003f44565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620026f5989796959493929190620042b3565b60405180910390a1620027e762000acb5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620027f857620027f862001d95565b50505050620019e460018055565b60685460ff1662002843576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ae2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6200295c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620033089092919063ffffffff16565b80519091501562001d9057808060200190518101906200297d91906200432b565b62001d90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200146b565b60026001540362002a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200146b565b6002600155565b5f62002a90600482848662004349565b62002a9b9162004372565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002d15575f80808080808062002afd896004818d62004349565b81019062002b0c9190620043bb565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002b80576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002bd0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002c0a576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002cc5919062003d79565b5f604051808303815f865af19150503d805f811462002d00576040519150601f19603f3d011682016040523d82523d5f602084013e62002d05565b606091505b5050505050505050505062000ae2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d91576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002da88a6004818e62004349565b81019062002db7919062004411565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002e2d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002e7d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002f41919062003d79565b5f604051808303815f865af19150503d805f811462002f7c576040519150601f19603f3d011682016040523d82523d5f602084013e62002f81565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015f79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002126565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003076919062003d79565b5f60405180830381855afa9150503d805f8114620030b0576040519150601f19603f3d011682016040523d82523d5f602084013e620030b5565b606091505b509150915081620030fc576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001be6565b62001be68162003318565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200318a919062003d79565b5f60405180830381855afa9150503d805f8114620031c4576040519150601f19603f3d011682016040523d82523d5f602084013e620031c9565b606091505b509150915081620030fc576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001be6565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162003292919062003d79565b5f60405180830381855afa9150503d805f8114620032cc576040519150601f19603f3d011682016040523d82523d5f602084013e620032d1565b606091505b5091509150818015620032e5575080516020145b620032f257601262001be6565b8080602001905181019062001be6919062004498565b606062001be684845f8562003503565b606060408251106200333a5781806020019051810190620008bc9190620044b6565b8151602003620034c5575f5b6020811080156200339157508281815181106200336757620033676200400e565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033ac5780620033a38162004068565b91505062003346565b805f03620033ef57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff8111156200340c576200340c62003d28565b6040519080825280601f01601f19166020018201604052801562003437576020820181803683370190505b5090505f5b82811015620034bd578481815181106200345a576200345a6200400e565b602001015160f81c60f81b8282815181106200347a576200347a6200400e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034b48162004068565b9150506200343c565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200146b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620035c1919062003d79565b5f6040518083038185875af1925050503d805f8114620035fd576040519150601f19603f3d011682016040523d82523d5f602084013e62003602565b606091505b5091509150620036158783838762003620565b979650505050505050565b60608315620036ba5782515f03620036b25773ffffffffffffffffffffffffffffffffffffffff85163b620036b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200146b565b508162001be6565b62001be68383815115620036d15781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200146b919062004531565b611b0d806200454683390190565b803563ffffffff81168114620034fe575f80fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001b03575f80fd5b5f80604083850312156200375d575f80fd5b620037688362003715565b915060208301356200377a8162003729565b809150509250929050565b801515811462001b03575f80fd5b5f8083601f840112620037a4575f80fd5b50813567ffffffffffffffff811115620037bc575f80fd5b602083019150836020828501011115620037d4575f80fd5b9250929050565b5f805f805f60808688031215620037f0575f80fd5b620037fb8662003715565b945060208601356200380d8162003729565b935060408601356200381f8162003785565b9250606086013567ffffffffffffffff8111156200383b575f80fd5b620038498882890162003793565b969995985093965092949392505050565b5f602082840312156200386b575f80fd5b5035919050565b5f6020828403121562003883575f80fd5b6200388e8262003715565b9392505050565b806104008101831015620008bc575f80fd5b5f805f805f805f805f805f6105208c8e031215620038c3575f80fd5b620038cf8d8d62003895565b9a50620038e06104008d0162003715565b99506104208c013598506104408c01359750620039016104608d0162003715565b96506104808c0135620039148162003729565b9550620039256104a08d0162003715565b94506104c08c0135620039388162003729565b93506104e08c013592506105008c013567ffffffffffffffff8111156200395d575f80fd5b6200396b8e828f0162003793565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003996575f80fd5b81356200388e8162003729565b60ff8116811462001b03575f80fd5b5f805f805f805f60e0888a031215620039c9575f80fd5b8735620039d681620039a3565b9650620039e66020890162003715565b95506040880135620039f88162003729565b945062003a086060890162003715565b9350608088013562003a1a8162003729565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003a4a575f80fd5b62003a558462003715565b9250602084013562003a678162003729565b9150604084013562003a798162003729565b809150509250925092565b5f805f610440848603121562003a98575f80fd5b8335925062003aab856020860162003895565b915062003abc610420850162003715565b90509250925092565b5f805f805f805f60a0888a03121562003adc575f80fd5b62003ae78862003715565b9650602088013562003af98162003729565b9550604088013567ffffffffffffffff8082111562003b16575f80fd5b62003b248b838c0162003793565b909750955060608a013591508082111562003b3d575f80fd5b5062003b4c8a828b0162003793565b909450925050608088013562003b6281620039a3565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003b89575f80fd5b62003b948862003715565b9650602088013562003ba68162003729565b955060408801359450606088013562003bbf8162003729565b9350608088013562003bd18162003785565b925060a088013567ffffffffffffffff81111562003bed575f80fd5b62003bfb8a828b0162003793565b989b979a50959850939692959293505050565b5f805f80610460858703121562003c23575f80fd5b8435935062003c36866020870162003895565b925062003c47610420860162003715565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003cff828501878962003c58565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003d7157818101518382015260200162003d57565b50505f910152565b5f825162003d8c81846020870162003d55565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003de05762003de062003d28565b604052919050565b5f67ffffffffffffffff82111562003e045762003e0462003d28565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003e40575f80fd5b813562003e5762003e518262003de8565b62003d96565b81815284602083860101111562003e6c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003e9b575f80fd5b833567ffffffffffffffff8082111562003eb3575f80fd5b62003ec18783880162003e30565b9450602086013591508082111562003ed7575f80fd5b5062003ee68682870162003e30565b925050604084013562003a7981620039a3565b5f815180845262003f1281602086016020860162003d55565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003f58606083018662003ef9565b828103602084015262003f6c818662003ef9565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200361560808301848662003c58565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f6200400460608301848662003c58565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200409b576200409b6200403b565b5060010190565b606081525f620040b760608301878962003c58565b8281036020840152620040cc81868862003c58565b91505060ff831660408301529695505050505050565b5f8351620040f581846020880162003d55565b8351908301906200410b81836020880162003d55565b01949350505050565b600181815b808511156200417357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156200415757620041576200403b565b808516156200416557918102915b93841c939080029062004119565b509250929050565b5f826200418b57506001620008bc565b816200419957505f620008bc565b8160018114620041b25760028114620041bd57620041dd565b6001915050620008bc565b60ff841115620041d157620041d16200403b565b50506001821b620008bc565b5060208310610133831016604e8410600b841016171562004202575081810a620008bc565b6200420e838362004114565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156200424357620042436200403b565b029392505050565b5f6200388e83836200417b565b81810381811115620008bc57620008bc6200403b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f60208284031215620042ac575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620043128285018762003ef9565b925080851660e085015250509998505050505050505050565b5f602082840312156200433c575f80fd5b81516200388e8162003785565b5f808585111562004358575f80fd5b8386111562004365575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043b35780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620043d2575f80fd5b8735620043df8162003729565b96506020880135620043f18162003729565b95506040880135945060608801359350608088013562003a1a81620039a3565b5f805f805f805f80610100898b0312156200442a575f80fd5b8835620044378162003729565b97506020890135620044498162003729565b965060408901359550606089013594506080890135620044698162003785565b935060a08901356200447b81620039a3565b979a969950949793969295929450505060c08201359160e0013590565b5f60208284031215620044a9575f80fd5b81516200388e81620039a3565b5f60208284031215620044c7575f80fd5b815167ffffffffffffffff811115620044de575f80fd5b8201601f81018413620044ef575f80fd5b80516200450062003e518262003de8565b81815285602083850101111562004515575f80fd5b6200452882602083016020860162003d55565b95945050505050565b602081525f6200388e602083018462003ef956fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212209b6ce339e0782833785e55be567c47a7623fa392322ca07d1904952201d6aca964736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001eb575f3560e01c806379e2cf971162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000734578063ee25560b146200074b578063f2fde38b146200077a578063fb570834146200079e575f80fd5b8063bab161bf1462000672578063be5831c714620006ab578063cd58657914620006e6578063d02103ca14620006fd575f80fd5b80638da5cb5b11620000de5780638da5cb5b14620005c857806391e57e2d14620005f45780639e34070f146200060b578063aaa13cc2146200064e575f80fd5b806379e2cf97146200054857806381b1c174146200055f57806383f2440314620005a4575f80fd5b80632d2c9d9411620001865780633e19704311620001525780633e19704314620004045780635ca1e16514620004f6578063647c576c146200050d578063715018a61462000531575f80fd5b80632d2c9d9414620003055780632dfdf0b51462000329578063318aee3d146200034f57806334ac9cf214620003d6575f80fd5b8063240ff37811620001c6578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002bd5780632cffd02e14620002e1575f80fd5b806315064c9614620001ef5780632072f6c5146200021f57806322e95f2c1462000238575b5f80fd5b348015620001fb575f80fd5b506068546200020a9060ff1681565b60405190151581526020015b60405180910390f35b3480156200022b575f80fd5b5062000236620007c2565b005b34801562000244575f80fd5b506200025c620002563660046200374b565b62000820565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000216565b6200023662000293366004620037db565b620008c2565b348015620002a5575f80fd5b5062000236620002b73660046200385a565b62000ae9565b348015620002c9575f80fd5b5062000236620002db36600462003872565b62000af8565b348015620002ed575f80fd5b5062000236620002ff366004620038a7565b62000b3e565b34801562000311575f80fd5b506200023662000323366004620038a7565b620010c3565b34801562000335575f80fd5b506200034060535481565b60405190815260200162000216565b3480156200035b575f80fd5b50620003a46200036d36600462003985565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000216565b348015620003e2575f80fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000410575f80fd5b506200034062000422366004620039b2565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000502575f80fd5b5062000340620012c3565b34801562000519575f80fd5b50620002366200052b36600462003a37565b620013a8565b3480156200053d575f80fd5b5062000236620015fd565b34801562000554575f80fd5b506200023662001612565b3480156200056b575f80fd5b506200025c6200057d3660046200385a565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005b0575f80fd5b5062000340620005c236600462003a84565b6200164c565b348015620005d4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b34801562000600575f80fd5b506200034060d15481565b34801562000617575f80fd5b506200020a620006293660046200385a565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200065a575f80fd5b506200025c6200066c36600462003ac5565b6200172f565b3480156200067e575f80fd5b506068546200069590610100900463ffffffff1681565b60405163ffffffff909116815260200162000216565b348015620006b7575f80fd5b506068546200069590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000236620006f736600462003b72565b62001919565b34801562000709575f80fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000740575f80fd5b5062000236620019ed565b34801562000757575f80fd5b5062000340620007693660046200385a565b60696020525f908152604090205481565b34801562000786575f80fd5b50620002366200079836600462003985565b62001a49565b348015620007aa575f80fd5b506200020a620007bc36600462003c0e565b62001b06565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462000814576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081e62001bee565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff161562000900576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009265750600263ffffffff861610155b156200095e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009b49998979695949392919062003c9f565b60405180910390a162000ad162000acb6001606860019054906101000a900463ffffffff16338989348989604051620009ef92919062003d19565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001c81565b821562000ae25762000ae262001d95565b5050505050565b62000af362001e65565b60d155565b62000b0262001e65565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b7c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b928b8b8b8b8b8b8b8b8b8b8b5f62001ee8565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be6919062003d79565b5f6040518083038185875af1925050503d805f811462000c22576040519150601f19603f3d011682016040523d82523d5f602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200104b565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff87168585620020d3565b6200104b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fc2575f808062000d7e8688018862003e88565b9250925092505f8584848460405162000d979062003707565b62000da59392919062003f44565b8190604051809103905ff590508015801562000dc3573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e36575f80fd5b505af115801562000e49573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fb095949392919062003f80565b60405180910390a15050505062001048565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001030575f80fd5b505af115801562001043573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562001101576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011188b8b8b8b8b8b8b8b8b8b8b600162001ee8565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200114a949392919062003fc7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011cd919062003d79565b5f6040518083038185875af1925050503d805f811462001209576040519150601f19603f3d011682016040523d82523d5f602084013e6200120e565b606091505b50509050806200124a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200139f578083901c600116600103620013305760338160208110620012fc57620012fc6200400e565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200135d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013969062004068565b915050620012cd565b50919392505050565b5f54610100900460ff1615808015620013c757505f54600160ff909116105b80620013e25750303b158015620013e257505f5460ff166001145b62001474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014d1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d15562001594620021a9565b8015620015f7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200160762001e65565b6200081e5f62002247565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff1610156200081e576200081e62001d95565b5f83815b60208110156200172657600163ffffffff8516821c81169003620016c2578481602081106200168357620016836200400e565b602002013582604051602001620016a4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001711565b81858260208110620016d857620016d86200400e565b6020020135604051602001620016f8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806200171d8162004068565b91505062001650565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620017c39062003707565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526200180e908d908d908d908d908d90602001620040a2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526200184c9291602001620040e2565b60405160208183030381529060405280519060200120604051602001620018d594939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620019d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200146b565b620019e487878787878787620022bd565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001a3f576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081e62002806565b62001a5362001e65565b73ffffffffffffffffffffffffffffffffffffffff811662001af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200146b565b62001b038162002247565b50565b5f84815b602081101562001be057600163ffffffff8616821c8116900362001b7c5785816020811062001b3d5762001b3d6200400e565b60200201358260405160200162001b5e929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001bcb565b8186826020811062001b925762001b926200400e565b602002013560405160200162001bb2929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001bd78162004068565b91505062001b0a565b50821490505b949350505050565b60685460ff161562001c2c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001c92602060026200424b565b62001c9e919062004258565b6053541062001cd9576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001cea9062004068565b918290555090505f5b602081101562001d85578082901c60011660010362001d2b57826033826020811062001d235762001d236200400e565b015550505050565b6033816020811062001d415762001d416200400e565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001d7c9062004068565b91505062001cf3565b5062001d906200426e565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001e1b620012c3565b6040518263ffffffff1660e01b815260040162001e3a91815260200190565b5f604051808303815f87803b15801562001e52575f80fd5b505af1158015620015f7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff1633146200081e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200146b565b62001ef98b63ffffffff1662002895565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001f98573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001fbe91906200429b565b9050805f0362001ff9576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462002043576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff166200206057508962002063565b508a5b6200208c62002083848c8c8c8c8c8c8c604051620009ef92919062003d19565b8f8f8462001b06565b620020c3576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001d909084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620028f9565b5f54610100900460ff1662002241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200146b565b6200081e335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620022fb576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200230562002a0b565b60685463ffffffff8881166101009092041614806200232b5750600263ffffffff881610155b1562002363576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620023c757883414620023be576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620026b4565b341562002400576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620024e9576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620024bf575f80fd5b505af1158015620024d2573d5f803e3d5ffd5b5050505080602001519450805f01519350620026b2565b8515620024fe57620024fe898b898962002a80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002569573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200258f91906200429b565b9050620025b573ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f93565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002620573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200264691906200429b565b905062002654828262004258565b6068548c9850610100900463ffffffff1696509350620026748762002ff3565b6200267f8c62003107565b6200268a8d62003210565b6040516020016200269e9392919062003f44565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620026f5989796959493929190620042b3565b60405180910390a1620027e762000acb5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620027f857620027f862001d95565b50505050620019e460018055565b60685460ff1662002843576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ae2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6200295c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620033089092919063ffffffff16565b80519091501562001d9057808060200190518101906200297d91906200432b565b62001d90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200146b565b60026001540362002a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200146b565b6002600155565b5f62002a90600482848662004349565b62002a9b9162004372565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002d15575f80808080808062002afd896004818d62004349565b81019062002b0c9190620043bb565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002b80576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002bd0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002c0a576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002cc5919062003d79565b5f604051808303815f865af19150503d805f811462002d00576040519150601f19603f3d011682016040523d82523d5f602084013e62002d05565b606091505b5050505050505050505062000ae2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d91576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002da88a6004818e62004349565b81019062002db7919062004411565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002e2d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002e7d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002f41919062003d79565b5f604051808303815f865af19150503d805f811462002f7c576040519150601f19603f3d011682016040523d82523d5f602084013e62002f81565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015f79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002126565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003076919062003d79565b5f60405180830381855afa9150503d805f8114620030b0576040519150601f19603f3d011682016040523d82523d5f602084013e620030b5565b606091505b509150915081620030fc576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001be6565b62001be68162003318565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200318a919062003d79565b5f60405180830381855afa9150503d805f8114620031c4576040519150601f19603f3d011682016040523d82523d5f602084013e620031c9565b606091505b509150915081620030fc576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001be6565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162003292919062003d79565b5f60405180830381855afa9150503d805f8114620032cc576040519150601f19603f3d011682016040523d82523d5f602084013e620032d1565b606091505b5091509150818015620032e5575080516020145b620032f257601262001be6565b8080602001905181019062001be6919062004498565b606062001be684845f8562003503565b606060408251106200333a5781806020019051810190620008bc9190620044b6565b8151602003620034c5575f5b6020811080156200339157508281815181106200336757620033676200400e565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033ac5780620033a38162004068565b91505062003346565b805f03620033ef57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff8111156200340c576200340c62003d28565b6040519080825280601f01601f19166020018201604052801562003437576020820181803683370190505b5090505f5b82811015620034bd578481815181106200345a576200345a6200400e565b602001015160f81c60f81b8282815181106200347a576200347a6200400e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034b48162004068565b9150506200343c565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200146b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620035c1919062003d79565b5f6040518083038185875af1925050503d805f8114620035fd576040519150601f19603f3d011682016040523d82523d5f602084013e62003602565b606091505b5091509150620036158783838762003620565b979650505050505050565b60608315620036ba5782515f03620036b25773ffffffffffffffffffffffffffffffffffffffff85163b620036b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200146b565b508162001be6565b62001be68383815115620036d15781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200146b919062004531565b611b0d806200454683390190565b803563ffffffff81168114620034fe575f80fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001b03575f80fd5b5f80604083850312156200375d575f80fd5b620037688362003715565b915060208301356200377a8162003729565b809150509250929050565b801515811462001b03575f80fd5b5f8083601f840112620037a4575f80fd5b50813567ffffffffffffffff811115620037bc575f80fd5b602083019150836020828501011115620037d4575f80fd5b9250929050565b5f805f805f60808688031215620037f0575f80fd5b620037fb8662003715565b945060208601356200380d8162003729565b935060408601356200381f8162003785565b9250606086013567ffffffffffffffff8111156200383b575f80fd5b620038498882890162003793565b969995985093965092949392505050565b5f602082840312156200386b575f80fd5b5035919050565b5f6020828403121562003883575f80fd5b6200388e8262003715565b9392505050565b806104008101831015620008bc575f80fd5b5f805f805f805f805f805f6105208c8e031215620038c3575f80fd5b620038cf8d8d62003895565b9a50620038e06104008d0162003715565b99506104208c013598506104408c01359750620039016104608d0162003715565b96506104808c0135620039148162003729565b9550620039256104a08d0162003715565b94506104c08c0135620039388162003729565b93506104e08c013592506105008c013567ffffffffffffffff8111156200395d575f80fd5b6200396b8e828f0162003793565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003996575f80fd5b81356200388e8162003729565b60ff8116811462001b03575f80fd5b5f805f805f805f60e0888a031215620039c9575f80fd5b8735620039d681620039a3565b9650620039e66020890162003715565b95506040880135620039f88162003729565b945062003a086060890162003715565b9350608088013562003a1a8162003729565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003a4a575f80fd5b62003a558462003715565b9250602084013562003a678162003729565b9150604084013562003a798162003729565b809150509250925092565b5f805f610440848603121562003a98575f80fd5b8335925062003aab856020860162003895565b915062003abc610420850162003715565b90509250925092565b5f805f805f805f60a0888a03121562003adc575f80fd5b62003ae78862003715565b9650602088013562003af98162003729565b9550604088013567ffffffffffffffff8082111562003b16575f80fd5b62003b248b838c0162003793565b909750955060608a013591508082111562003b3d575f80fd5b5062003b4c8a828b0162003793565b909450925050608088013562003b6281620039a3565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003b89575f80fd5b62003b948862003715565b9650602088013562003ba68162003729565b955060408801359450606088013562003bbf8162003729565b9350608088013562003bd18162003785565b925060a088013567ffffffffffffffff81111562003bed575f80fd5b62003bfb8a828b0162003793565b989b979a50959850939692959293505050565b5f805f80610460858703121562003c23575f80fd5b8435935062003c36866020870162003895565b925062003c47610420860162003715565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003cff828501878962003c58565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003d7157818101518382015260200162003d57565b50505f910152565b5f825162003d8c81846020870162003d55565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003de05762003de062003d28565b604052919050565b5f67ffffffffffffffff82111562003e045762003e0462003d28565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003e40575f80fd5b813562003e5762003e518262003de8565b62003d96565b81815284602083860101111562003e6c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003e9b575f80fd5b833567ffffffffffffffff8082111562003eb3575f80fd5b62003ec18783880162003e30565b9450602086013591508082111562003ed7575f80fd5b5062003ee68682870162003e30565b925050604084013562003a7981620039a3565b5f815180845262003f1281602086016020860162003d55565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003f58606083018662003ef9565b828103602084015262003f6c818662003ef9565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200361560808301848662003c58565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f6200400460608301848662003c58565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200409b576200409b6200403b565b5060010190565b606081525f620040b760608301878962003c58565b8281036020840152620040cc81868862003c58565b91505060ff831660408301529695505050505050565b5f8351620040f581846020880162003d55565b8351908301906200410b81836020880162003d55565b01949350505050565b600181815b808511156200417357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156200415757620041576200403b565b808516156200416557918102915b93841c939080029062004119565b509250929050565b5f826200418b57506001620008bc565b816200419957505f620008bc565b8160018114620041b25760028114620041bd57620041dd565b6001915050620008bc565b60ff841115620041d157620041d16200403b565b50506001821b620008bc565b5060208310610133831016604e8410600b841016171562004202575081810a620008bc565b6200420e838362004114565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156200424357620042436200403b565b029392505050565b5f6200388e83836200417b565b81810381811115620008bc57620008bc6200403b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f60208284031215620042ac575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620043128285018762003ef9565b925080851660e085015250509998505050505050505050565b5f602082840312156200433c575f80fd5b81516200388e8162003785565b5f808585111562004358575f80fd5b8386111562004365575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043b35780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620043d2575f80fd5b8735620043df8162003729565b96506020880135620043f18162003729565b95506040880135945060608801359350608088013562003a1a81620039a3565b5f805f805f805f80610100898b0312156200442a575f80fd5b8835620044378162003729565b97506020890135620044498162003729565b965060408901359550606089013594506080890135620044698162003785565b935060a08901356200447b81620039a3565b979a969950949793969295929450505060c08201359160e0013590565b5f60208284031215620044a9575f80fd5b81516200388e81620039a3565b5f60208284031215620044c7575f80fd5b815167ffffffffffffffff811115620044de575f80fd5b8201601f81018413620044ef575f80fd5b80516200450062003e518262003de8565b81815285602083850101111562004515575f80fd5b6200452882602083016020860162003d55565b95945050505050565b602081525f6200388e602083018462003ef956fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212209b6ce339e0782833785e55be567c47a7623fa392322ca07d1904952201d6aca964736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b50615f348061001d5f395ff3fe608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220b6bef336f4ffaee30246ce2daa5abeb49dede3d0b3bd216d94f3614697bc150b64736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220b6bef336f4ffaee30246ce2daa5abeb49dede3d0b3bd216d94f3614697bc150b64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMBridgeV2.json b/compiled-contracts/PolygonZkEVMBridgeV2.json new file mode 100644 index 000000000..99084e180 --- /dev/null +++ b/compiled-contracts/PolygonZkEVMBridgeV2.json @@ -0,0 +1,924 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMBridgeV2", + "sourceName": "contracts/v2/PolygonZkEVMBridgeV2.sol", + "abi": [ + { + "inputs": [], + "name": "AlreadyClaimed", + "type": "error" + }, + { + "inputs": [], + "name": "AmountDoesNotMatchMsgValue", + "type": "error" + }, + { + "inputs": [], + "name": "DestinationNetworkInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "EtherTransferFailed", + "type": "error" + }, + { + "inputs": [], + "name": "GasTokenNetworkMustBeZeroOnEther", + "type": "error" + }, + { + "inputs": [], + "name": "GlobalExitRootInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSmtProof", + "type": "error" + }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, + { + "inputs": [], + "name": "MessageFailed", + "type": "error" + }, + { + "inputs": [], + "name": "MsgValueNotZero", + "type": "error" + }, + { + "inputs": [], + "name": "NativeTokenIsEther", + "type": "error" + }, + { + "inputs": [], + "name": "NoValueInMessagesOnGasTokenNetworks", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidOwner", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidSignature", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidSpender", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyNotEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyRollupManager", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "leafType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "originAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "depositCount", + "type": "uint32" + } + ], + "name": "BridgeEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "globalIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "originAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ClaimEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyStateActivated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyStateDeactivated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "wrappedTokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "NewWrappedToken", + "type": "event" + }, + { + "inputs": [], + "name": "WETHToken", + "outputs": [ + { + "internalType": "contract TokenWrapped", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "activateEmergencyState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "bool", + "name": "forceUpdateGlobalExitRoot", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "permitData", + "type": "bytes" + } + ], + "name": "bridgeAsset", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "bool", + "name": "forceUpdateGlobalExitRoot", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "bridgeMessage", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountWETH", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "forceUpdateGlobalExitRoot", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "bridgeMessageWETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "leafHash", + "type": "bytes32" + }, + { + "internalType": "bytes32[32]", + "name": "smtProof", + "type": "bytes32[32]" + }, + { + "internalType": "uint32", + "name": "index", + "type": "uint32" + } + ], + "name": "calculateRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[32]", + "name": "smtProofLocalExitRoot", + "type": "bytes32[32]" + }, + { + "internalType": "bytes32[32]", + "name": "smtProofRollupExitRoot", + "type": "bytes32[32]" + }, + { + "internalType": "uint256", + "name": "globalIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "mainnetExitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "rollupExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "claimAsset", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[32]", + "name": "smtProofLocalExitRoot", + "type": "bytes32[32]" + }, + { + "internalType": "bytes32[32]", + "name": "smtProofRollupExitRoot", + "type": "bytes32[32]" + }, + { + "internalType": "uint256", + "name": "globalIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "mainnetExitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "rollupExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "claimMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "claimedBitMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deactivateEmergencyState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "depositCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenNetwork", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "leafType", + "type": "uint8" + }, + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "metadataHash", + "type": "bytes32" + } + ], + "name": "getLeafValue", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + } + ], + "name": "getTokenWrappedAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_networkID", + "type": "uint32" + }, + { + "internalType": "address", + "name": "_gasTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_gasTokenNetwork", + "type": "uint32" + }, + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "address", + "name": "_polygonRollupManager", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "leafIndex", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "sourceBridgeNetwork", + "type": "uint32" + } + ], + "name": "isClaimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isEmergencyState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdatedDepositCount", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "networkID", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "polygonRollupManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint8", + "name": "decimals", + "type": "uint8" + } + ], + "name": "precalculatedWrapperAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "tokenInfoToWrappedToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "updateGlobalExitRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "leafHash", + "type": "bytes32" + }, + { + "internalType": "bytes32[32]", + "name": "smtProof", + "type": "bytes32[32]" + }, + { + "internalType": "uint32", + "name": "index", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "verifyMerkleProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "wrappedTokenToTokenInfo", + "outputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561000f575f80fd5b50615f898061001d5f395ff3fe608060405260043610620001d3575f3560e01c80638ed7e3f211620000fa578063cd5865791162000092578063dbc16976116200006a578063dbc169761462000685578063ee25560b146200069c578063f5efcd7914620006cb578063fb57083414620006ef575f80fd5b8063cd5865791462000620578063d02103ca1462000637578063d3476afe1462000661575f80fd5b8063bab161bf11620000d2578063bab161bf146200057a578063be5831c7146200059d578063cc46163214620005d8578063ccaa2d1114620005fc575f80fd5b80638ed7e3f21462000511578063aaa13cc21462000532578063b8b284d01462000556575f80fd5b80633cbc795b116200016e5780635ca1e16511620001465780635ca1e165146200048757806379e2cf97146200049e57806381b1c17414620004b557806383f2440314620004ed575f80fd5b80633cbc795b14620003285780633e19704314620003745780634b2f336d1462000466575f80fd5b8063240ff37811620001ae578063240ff378146200025d5780632dfdf0b51462000274578063318aee3d146200029a5780633c351e101462000307575f80fd5b806315064c9614620001d75780632072f6c5146200020757806322e95f2c1462000220575b5f80fd5b348015620001e3575f80fd5b50606854620001f29060ff1681565b60405190151581526020015b60405180910390f35b34801562000213575f80fd5b506200021e62000713565b005b3480156200022c575f80fd5b50620002446200023e36600462003723565b62000764565b6040516001600160a01b039091168152602001620001fe565b6200021e6200026e366004620037b3565b620007f9565b34801562000280575f80fd5b506200028b60535481565b604051908152602001620001fe565b348015620002a6575f80fd5b50620002e2620002b836600462003832565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001fe565b34801562000313575f80fd5b50606d5462000244906001600160a01b031681565b34801562000334575f80fd5b50606d546200035e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001620001fe565b34801562000380575f80fd5b506200028b6200039236600462003866565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50606e5462000244906001600160a01b031681565b34801562000493575f80fd5b506200028b62000862565b348015620004aa575f80fd5b506200021e62000947565b348015620004c1575f80fd5b5062000244620004d3366004620038eb565b606a6020525f90815260409020546001600160a01b031681565b348015620004f9575f80fd5b506200028b6200050b36600462003915565b62000981565b3480156200051d575f80fd5b50606c5462000244906001600160a01b031681565b3480156200053e575f80fd5b50620002446200055036600462003956565b62000a64565b34801562000562575f80fd5b506200021e6200057436600462003a03565b62000bf4565b34801562000586575f80fd5b506068546200035e90610100900463ffffffff1681565b348015620005a9575f80fd5b506068546200035e90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b348015620005e4575f80fd5b50620001f2620005f636600462003a8b565b62000cc9565b34801562000608575f80fd5b506200021e6200061a36600462003ac1565b62000d58565b6200021e6200063136600462003bb5565b6200144d565b34801562000643575f80fd5b5060685462000244906501000000000090046001600160a01b031681565b3480156200066d575f80fd5b506200021e6200067f36600462003c51565b62001a03565b34801562000691575f80fd5b506200021e62001dd7565b348015620006a8575f80fd5b506200028b620006ba366004620038eb565b60696020525f908152604090205481565b348015620006d7575f80fd5b506200021e620006e936600462003ac1565b62001e26565b348015620006fb575f80fd5b50620001f26200070d36600462003cc5565b620021aa565b606c546001600160a01b0316331462000758576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620021c5565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b3415801590620008135750606e546001600160a01b031615155b156200084b576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200085b85853486868662002258565b5050505050565b6053545f90819081805b60208110156200093e578083901c600116600103620008cf57603381602081106200089b576200089b62003d0f565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620008fc565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009359062003d69565b9150506200086c565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000762576200076262002340565b5f83815b602081101562000a5b57600163ffffffff8516821c81169003620009f757848160208110620009b857620009b862003d0f565b602002013582604051602001620009d9929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a46565b8185826020811062000a0d5762000a0d62003d0f565b602002013560405160200162000a2d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a528162003d69565b91505062000985565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000af890620036e9565b601f1982820381018352601f90910116604081905262000b25908d908d908d908d908d9060200162003dcc565b60408051601f198184030181529082905262000b45929160200162003e30565b6040516020818303038152906040528051906020012060405160200162000bce94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c37576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000c9a575f80fd5b505af115801562000cad573d5f803e3d5ffd5b5050505062000cc186868686868662002258565b505050505050565b6068545f908190610100900463ffffffff1615801562000cef575063ffffffff83166001145b1562000d03575063ffffffff831662000d2f565b62000d1a64010000000063ffffffff851662003e62565b62000d2c9063ffffffff861662003e7c565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d96576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000de0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000ee78c8c8c8c8c62000ee15f8e8e8e8e8e8e8e60405162000e0592919062003e92565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002409565b6001600160a01b0386166200105657606e546001600160a01b031662000fd4575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f40576020820181803683370190505b5060405162000f50919062003ece565b5f6040518083038185875af1925050503d805f811462000f8c576040519150601f19603f3d011682016040523d82523d5f602084013e62000f91565b606091505b505090508062000fcd576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620013e3565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b15801562001039575f80fd5b505af11580156200104c573d5f803e3d5ffd5b50505050620013e3565b606d546001600160a01b038781169116148015620010965750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010af575f6001600160a01b038516848262000f15565b60685463ffffffff610100909104811690881603620010e457620010de6001600160a01b0387168585620025e1565b620013e3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062001367575f80806200118b8688018862003fa1565b9250925092505f85848484604051620011a490620036e9565b620011b2939291906200404a565b8190604051809103905ff5905080158015620011d0573d5f803e3d5ffd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562001236575f80fd5b505af115801562001249573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200135595949392919062004086565b60405180910390a150505050620013e0565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b158015620013c8575f80fd5b505af1158015620013db573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156200148b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200149562002691565b60685463ffffffff610100909104811690881603620014e0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806060876001600160a01b03881662001563578834146200152e576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff169250620018a2565b34156200159c576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200162f576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b15801562001612575f80fd5b505af115801562001625573d5f803e3d5ffd5b50505050620018a2565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620016fe576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015620016d4575f80fd5b505af1158015620016e7573d5f803e3d5ffd5b5050505080602001519450805f01519350620018a0565b8515620017135762001713898b898962002706565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa15801562001771573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017979190620040c0565b9050620017b06001600160a01b038b1633308e62002bb1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200180e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620018349190620040c0565b9050620018428282620040d8565b6068548c9850610100900463ffffffff1696509350620018628762002c04565b6200186d8c62002d0b565b620018788d62002e07565b6040516020016200188c939291906200404a565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620018e3989796959493929190620040ee565b60405180910390a1620019db620019d55f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002ef2565b8615620019ec57620019ec62002340565b50505050620019fa60018055565b50505050505050565b5f54610100900460ff161580801562001a2257505f54600160ff909116105b8062001a3d5750303b15801562001a3d57505f5460ff166001145b62001acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001b2c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001c3157606d5474010000000000000000000000000000000000000000900463ffffffff161562001c2b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001d63565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b038816171790556040515f9060129062001c9890620036e9565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001d29573d5f803e3d5ffd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001d6d62003007565b801562000cc1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e1c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620030a9565b60685460ff161562001e64576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001eae576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ed48c8c8c8c8c62000ee160018e8e8e8e8e8e8e60405162000e0592919062003e92565b606e545f906001600160a01b031662001fbd57846001600160a01b031684888a868660405160240162001f0b949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001f70919062003ece565b5f6040518083038185875af1925050503d805f811462001fac576040519150601f19603f3d011682016040523d82523d5f602084013e62001fb1565b606091505b50508091505062002107565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562002022575f80fd5b505af115801562002035573d5f803e3d5ffd5b50505050846001600160a01b0316878985856040516024016200205c949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620020c1919062003ece565b5f604051808303815f865af19150503d805f8114620020fc576040519150601f19603f3d011682016040523d82523d5f602084013e62002101565b606091505b50909150505b806200213f576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f81620021b986868662000981565b1490505b949350505050565b60685460ff161562002203576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603620022a3576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051620022f99998979695949392919062004193565b60405180910390a162002334620019d56001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0592919062003e92565b821562000cc15762000cc15b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620023b962000862565b6040518263ffffffff1660e01b8152600401620023d891815260200190565b5f604051808303815f87803b158015620023f0575f80fd5b505af115801562002403573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af11580156200249b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620024c19190620040c0565b9050805f03620024fc576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716600103620025605786915062002523848a8489620021aa565b6200255a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620025ca565b602087901c6200257281600162004200565b91508792506200259162002588868c8662000981565b8a8389620021aa565b620025c8576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620025d6828262003138565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200268c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003200565b505050565b600260015403620026ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ac6565b6002600155565b5f62002716600482848662004227565b620027219162004250565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002967575f80808080808062002783896004818d62004227565b81019062002792919062004299565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620027ec576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861630146200282f576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002869576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002917919062003ece565b5f604051808303815f865af19150503d805f811462002952576040519150601f19603f3d011682016040523d82523d5f602084013e62002957565b606091505b505050505050505050506200085b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620029e3576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620029fa8a6004818e62004227565b81019062002a099190620042ef565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002a65576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002aa8576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002b5f919062003ece565b5f604051808303815f865af19150503d805f811462002b9a576040519150601f19603f3d011682016040523d82523d5f602084013e62002b9f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024039085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002627565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002c7a919062003ece565b5f60405180830381855afa9150503d805f811462002cb4576040519150601f19603f3d011682016040523d82523d5f602084013e62002cb9565b606091505b50915091508162002d00576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250620021bd565b620021bd8162003305565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002d81919062003ece565b5f60405180830381855afa9150503d805f811462002dbb576040519150601f19603f3d011682016040523d82523d5f602084013e62002dc0565b606091505b50915091508162002d00576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250620021bd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002e7c919062003ece565b5f60405180830381855afa9150503d805f811462002eb6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ebb565b606091505b509150915081801562002ecf575080516020145b62002edc576012620021bd565b80806020019051810190620021bd919062004376565b80600162002f0360206002620044cb565b62002f0f9190620040d8565b6053541062002f4a576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002f5b9062003d69565b918290555090505f5b602081101562002ff6578082901c60011660010362002f9c57826033826020811062002f945762002f9462003d0f565b015550505050565b6033816020811062002fb25762002fb262003d0f565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002fed9062003d69565b91505062002f64565b506200268c620044d8565b60018055565b5f54610100900460ff166200309f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b62000762620034f0565b60685460ff16620030e6576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6068545f90610100900463ffffffff161580156200315c575063ffffffff82166001145b1562003170575063ffffffff82166200319c565b6200318764010000000063ffffffff841662003e62565b620031999063ffffffff851662003e7c565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620019fa576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003256826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620035889092919063ffffffff16565b8051909150156200268c578080602001905181019062003277919062004505565b6200268c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001ac6565b60606040825110620033275781806020019051810190620007f3919062004523565b8151602003620034b2575f5b6020811080156200337e575082818151811062003354576200335462003d0f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033995780620033908162003d69565b91505062003333565b805f03620033dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620033f957620033f962003ea1565b6040519080825280601f01601f19166020018201604052801562003424576020820181803683370190505b5090505f5b82811015620034aa5784818151811062003447576200344762003d0f565b602001015160f81c60f81b82828151811062003467576200346762003d0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034a18162003d69565b91505062003429565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b5f54610100900460ff1662003001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b6060620021bd84845f85855f80866001600160a01b03168587604051620035b0919062003ece565b5f6040518083038185875af1925050503d805f8114620035ec576040519150601f19603f3d011682016040523d82523d5f602084013e620035f1565b606091505b509150915062003604878383876200360f565b979650505050505050565b606083156200369c5782515f0362003694576001600160a01b0385163b62003694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ac6565b5081620021bd565b620021bd8383815115620036b35781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ac691906200459e565b6119a180620045b383390190565b803563ffffffff81168114620034eb575f80fd5b6001600160a01b038116811462003720575f80fd5b50565b5f806040838503121562003735575f80fd5b6200374083620036f7565b9150602083013562003752816200370b565b809150509250929050565b801515811462003720575f80fd5b5f8083601f8401126200377c575f80fd5b50813567ffffffffffffffff81111562003794575f80fd5b602083019150836020828501011115620037ac575f80fd5b9250929050565b5f805f805f60808688031215620037c8575f80fd5b620037d386620036f7565b94506020860135620037e5816200370b565b93506040860135620037f7816200375d565b9250606086013567ffffffffffffffff81111562003813575f80fd5b62003821888289016200376b565b969995985093965092949392505050565b5f6020828403121562003843575f80fd5b813562003850816200370b565b9392505050565b60ff8116811462003720575f80fd5b5f805f805f805f60e0888a0312156200387d575f80fd5b87356200388a8162003857565b96506200389a60208901620036f7565b95506040880135620038ac816200370b565b9450620038bc60608901620036f7565b93506080880135620038ce816200370b565b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215620038fc575f80fd5b5035919050565b806104008101831015620007f3575f80fd5b5f805f610440848603121562003929575f80fd5b833592506200393c856020860162003903565b91506200394d6104208501620036f7565b90509250925092565b5f805f805f805f60a0888a0312156200396d575f80fd5b6200397888620036f7565b965060208801356200398a816200370b565b9550604088013567ffffffffffffffff80821115620039a7575f80fd5b620039b58b838c016200376b565b909750955060608a0135915080821115620039ce575f80fd5b50620039dd8a828b016200376b565b9094509250506080880135620039f38162003857565b8091505092959891949750929550565b5f805f805f8060a0878903121562003a19575f80fd5b62003a2487620036f7565b9550602087013562003a36816200370b565b945060408701359350606087013562003a4f816200375d565b9250608087013567ffffffffffffffff81111562003a6b575f80fd5b62003a7989828a016200376b565b979a9699509497509295939492505050565b5f806040838503121562003a9d575f80fd5b62003aa883620036f7565b915062003ab860208401620036f7565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562003ade575f80fd5b62003aea8e8e62003903565b9b5062003afc8e6104008f0162003903565b9a506108008d013599506108208d013598506108408d0135975062003b256108608e01620036f7565b965062003b376108808e01356200370b565b6108808d0135955062003b4e6108a08e01620036f7565b945062003b606108c08e01356200370b565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003b8a575f80fd5b62003b9d8e6109008f01358f016200376b565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562003bcc575f80fd5b62003bd788620036f7565b9650602088013562003be9816200370b565b955060408801359450606088013562003c02816200370b565b9350608088013562003c14816200375d565b925060a088013567ffffffffffffffff81111562003c30575f80fd5b62003c3e8a828b016200376b565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562003c66575f80fd5b62003c7186620036f7565b9450602086013562003c83816200370b565b935062003c9360408701620036f7565b9250606086013562003ca5816200370b565b9150608086013562003cb7816200370b565b809150509295509295909350565b5f805f80610460858703121562003cda575f80fd5b8435935062003ced866020870162003903565b925062003cfe6104208601620036f7565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003d9c5762003d9c62003d3c565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b606081525f62003de160608301878962003da3565b828103602084015262003df681868862003da3565b91505060ff831660408301529695505050505050565b5f5b8381101562003e2857818101518382015260200162003e0e565b50505f910152565b5f835162003e4381846020880162003e0c565b83519083019062003e5981836020880162003e0c565b01949350505050565b8082028115828204841417620007f357620007f362003d3c565b80820180821115620007f357620007f362003d3c565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f825162003ee181846020870162003e0c565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562003f175762003f1762003ea1565b604052919050565b5f67ffffffffffffffff82111562003f3b5762003f3b62003ea1565b50601f01601f191660200190565b5f82601f83011262003f59575f80fd5b813562003f7062003f6a8262003f1f565b62003eeb565b81815284602083860101111562003f85575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003fb4575f80fd5b833567ffffffffffffffff8082111562003fcc575f80fd5b62003fda8783880162003f49565b9450602086013591508082111562003ff0575f80fd5b5062003fff8682870162003f49565b9250506040840135620040128162003857565b809150509250925092565b5f81518084526200403681602086016020860162003e0c565b601f01601f19169290920160200192915050565b606081525f6200405e60608301866200401d565b82810360208401526200407281866200401d565b91505060ff83166040830152949350505050565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200360460808301848662003da3565b5f60208284031215620040d1575f80fd5b5051919050565b81810381811115620007f357620007f362003d3c565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262004140828501876200401d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6200418960608301848662003da3565b9695505050505050565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620041e6828501878962003da3565b925080851660e085015250509a9950505050505050505050565b63ffffffff81811683821601908082111562004220576200422062003d3c565b5092915050565b5f808585111562004236575f80fd5b8386111562004243575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042915780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620042b0575f80fd5b8735620042bd816200370b565b96506020880135620042cf816200370b565b955060408801359450606088013593506080880135620038ce8162003857565b5f805f805f805f80610100898b03121562004308575f80fd5b883562004315816200370b565b9750602089013562004327816200370b565b96506040890135955060608901359450608089013562004347816200375d565b935060a0890135620043598162003857565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004387575f80fd5b8151620038508162003857565b600181815b80851115620043f357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620043d757620043d762003d3c565b80851615620043e557918102915b93841c939080029062004399565b509250929050565b5f826200440b57506001620007f3565b816200441957505f620007f3565b81600181146200443257600281146200443d576200445d565b6001915050620007f3565b60ff84111562004451576200445162003d3c565b50506001821b620007f3565b5060208310610133831016604e8410600b841016171562004482575081810a620007f3565b6200448e838362004394565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620044c357620044c362003d3c565b029392505050565b5f620038508383620043fb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004516575f80fd5b815162003850816200375d565b5f6020828403121562004534575f80fd5b815167ffffffffffffffff8111156200454b575f80fd5b8201601f810184136200455c575f80fd5b80516200456d62003f6a8262003f1f565b81815285602083850101111562004582575f80fd5b6200459582602083016020860162003e0c565b95945050505050565b602081525f6200385060208301846200401d56fe61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033a26469706673582212209002ffc0c7cb9056d22d47ac65cf05714a8ae8ce0af7e882f7e68b9fdede830e64736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001d3575f3560e01c80638ed7e3f211620000fa578063cd5865791162000092578063dbc16976116200006a578063dbc169761462000685578063ee25560b146200069c578063f5efcd7914620006cb578063fb57083414620006ef575f80fd5b8063cd5865791462000620578063d02103ca1462000637578063d3476afe1462000661575f80fd5b8063bab161bf11620000d2578063bab161bf146200057a578063be5831c7146200059d578063cc46163214620005d8578063ccaa2d1114620005fc575f80fd5b80638ed7e3f21462000511578063aaa13cc21462000532578063b8b284d01462000556575f80fd5b80633cbc795b116200016e5780635ca1e16511620001465780635ca1e165146200048757806379e2cf97146200049e57806381b1c17414620004b557806383f2440314620004ed575f80fd5b80633cbc795b14620003285780633e19704314620003745780634b2f336d1462000466575f80fd5b8063240ff37811620001ae578063240ff378146200025d5780632dfdf0b51462000274578063318aee3d146200029a5780633c351e101462000307575f80fd5b806315064c9614620001d75780632072f6c5146200020757806322e95f2c1462000220575b5f80fd5b348015620001e3575f80fd5b50606854620001f29060ff1681565b60405190151581526020015b60405180910390f35b34801562000213575f80fd5b506200021e62000713565b005b3480156200022c575f80fd5b50620002446200023e36600462003723565b62000764565b6040516001600160a01b039091168152602001620001fe565b6200021e6200026e366004620037b3565b620007f9565b34801562000280575f80fd5b506200028b60535481565b604051908152602001620001fe565b348015620002a6575f80fd5b50620002e2620002b836600462003832565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001fe565b34801562000313575f80fd5b50606d5462000244906001600160a01b031681565b34801562000334575f80fd5b50606d546200035e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001620001fe565b34801562000380575f80fd5b506200028b6200039236600462003866565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50606e5462000244906001600160a01b031681565b34801562000493575f80fd5b506200028b62000862565b348015620004aa575f80fd5b506200021e62000947565b348015620004c1575f80fd5b5062000244620004d3366004620038eb565b606a6020525f90815260409020546001600160a01b031681565b348015620004f9575f80fd5b506200028b6200050b36600462003915565b62000981565b3480156200051d575f80fd5b50606c5462000244906001600160a01b031681565b3480156200053e575f80fd5b50620002446200055036600462003956565b62000a64565b34801562000562575f80fd5b506200021e6200057436600462003a03565b62000bf4565b34801562000586575f80fd5b506068546200035e90610100900463ffffffff1681565b348015620005a9575f80fd5b506068546200035e90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b348015620005e4575f80fd5b50620001f2620005f636600462003a8b565b62000cc9565b34801562000608575f80fd5b506200021e6200061a36600462003ac1565b62000d58565b6200021e6200063136600462003bb5565b6200144d565b34801562000643575f80fd5b5060685462000244906501000000000090046001600160a01b031681565b3480156200066d575f80fd5b506200021e6200067f36600462003c51565b62001a03565b34801562000691575f80fd5b506200021e62001dd7565b348015620006a8575f80fd5b506200028b620006ba366004620038eb565b60696020525f908152604090205481565b348015620006d7575f80fd5b506200021e620006e936600462003ac1565b62001e26565b348015620006fb575f80fd5b50620001f26200070d36600462003cc5565b620021aa565b606c546001600160a01b0316331462000758576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620021c5565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b3415801590620008135750606e546001600160a01b031615155b156200084b576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200085b85853486868662002258565b5050505050565b6053545f90819081805b60208110156200093e578083901c600116600103620008cf57603381602081106200089b576200089b62003d0f565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620008fc565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009359062003d69565b9150506200086c565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000762576200076262002340565b5f83815b602081101562000a5b57600163ffffffff8516821c81169003620009f757848160208110620009b857620009b862003d0f565b602002013582604051602001620009d9929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a46565b8185826020811062000a0d5762000a0d62003d0f565b602002013560405160200162000a2d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a528162003d69565b91505062000985565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000af890620036e9565b601f1982820381018352601f90910116604081905262000b25908d908d908d908d908d9060200162003dcc565b60408051601f198184030181529082905262000b45929160200162003e30565b6040516020818303038152906040528051906020012060405160200162000bce94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c37576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000c9a575f80fd5b505af115801562000cad573d5f803e3d5ffd5b5050505062000cc186868686868662002258565b505050505050565b6068545f908190610100900463ffffffff1615801562000cef575063ffffffff83166001145b1562000d03575063ffffffff831662000d2f565b62000d1a64010000000063ffffffff851662003e62565b62000d2c9063ffffffff861662003e7c565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d96576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000de0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000ee78c8c8c8c8c62000ee15f8e8e8e8e8e8e8e60405162000e0592919062003e92565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002409565b6001600160a01b0386166200105657606e546001600160a01b031662000fd4575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f40576020820181803683370190505b5060405162000f50919062003ece565b5f6040518083038185875af1925050503d805f811462000f8c576040519150601f19603f3d011682016040523d82523d5f602084013e62000f91565b606091505b505090508062000fcd576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620013e3565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b15801562001039575f80fd5b505af11580156200104c573d5f803e3d5ffd5b50505050620013e3565b606d546001600160a01b038781169116148015620010965750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010af575f6001600160a01b038516848262000f15565b60685463ffffffff610100909104811690881603620010e457620010de6001600160a01b0387168585620025e1565b620013e3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062001367575f80806200118b8688018862003fa1565b9250925092505f85848484604051620011a490620036e9565b620011b2939291906200404a565b8190604051809103905ff5905080158015620011d0573d5f803e3d5ffd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562001236575f80fd5b505af115801562001249573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200135595949392919062004086565b60405180910390a150505050620013e0565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b158015620013c8575f80fd5b505af1158015620013db573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156200148b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200149562002691565b60685463ffffffff610100909104811690881603620014e0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806060876001600160a01b03881662001563578834146200152e576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff169250620018a2565b34156200159c576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200162f576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b15801562001612575f80fd5b505af115801562001625573d5f803e3d5ffd5b50505050620018a2565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620016fe576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015620016d4575f80fd5b505af1158015620016e7573d5f803e3d5ffd5b5050505080602001519450805f01519350620018a0565b8515620017135762001713898b898962002706565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa15801562001771573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017979190620040c0565b9050620017b06001600160a01b038b1633308e62002bb1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200180e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620018349190620040c0565b9050620018428282620040d8565b6068548c9850610100900463ffffffff1696509350620018628762002c04565b6200186d8c62002d0b565b620018788d62002e07565b6040516020016200188c939291906200404a565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620018e3989796959493929190620040ee565b60405180910390a1620019db620019d55f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002ef2565b8615620019ec57620019ec62002340565b50505050620019fa60018055565b50505050505050565b5f54610100900460ff161580801562001a2257505f54600160ff909116105b8062001a3d5750303b15801562001a3d57505f5460ff166001145b62001acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001b2c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001c3157606d5474010000000000000000000000000000000000000000900463ffffffff161562001c2b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001d63565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b038816171790556040515f9060129062001c9890620036e9565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001d29573d5f803e3d5ffd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001d6d62003007565b801562000cc1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e1c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620030a9565b60685460ff161562001e64576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001eae576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ed48c8c8c8c8c62000ee160018e8e8e8e8e8e8e60405162000e0592919062003e92565b606e545f906001600160a01b031662001fbd57846001600160a01b031684888a868660405160240162001f0b949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001f70919062003ece565b5f6040518083038185875af1925050503d805f811462001fac576040519150601f19603f3d011682016040523d82523d5f602084013e62001fb1565b606091505b50508091505062002107565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562002022575f80fd5b505af115801562002035573d5f803e3d5ffd5b50505050846001600160a01b0316878985856040516024016200205c949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620020c1919062003ece565b5f604051808303815f865af19150503d805f8114620020fc576040519150601f19603f3d011682016040523d82523d5f602084013e62002101565b606091505b50909150505b806200213f576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f81620021b986868662000981565b1490505b949350505050565b60685460ff161562002203576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603620022a3576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051620022f99998979695949392919062004193565b60405180910390a162002334620019d56001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0592919062003e92565b821562000cc15762000cc15b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620023b962000862565b6040518263ffffffff1660e01b8152600401620023d891815260200190565b5f604051808303815f87803b158015620023f0575f80fd5b505af115801562002403573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af11580156200249b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620024c19190620040c0565b9050805f03620024fc576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716600103620025605786915062002523848a8489620021aa565b6200255a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620025ca565b602087901c6200257281600162004200565b91508792506200259162002588868c8662000981565b8a8389620021aa565b620025c8576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620025d6828262003138565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200268c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003200565b505050565b600260015403620026ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ac6565b6002600155565b5f62002716600482848662004227565b620027219162004250565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002967575f80808080808062002783896004818d62004227565b81019062002792919062004299565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620027ec576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861630146200282f576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002869576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002917919062003ece565b5f604051808303815f865af19150503d805f811462002952576040519150601f19603f3d011682016040523d82523d5f602084013e62002957565b606091505b505050505050505050506200085b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620029e3576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620029fa8a6004818e62004227565b81019062002a099190620042ef565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002a65576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002aa8576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002b5f919062003ece565b5f604051808303815f865af19150503d805f811462002b9a576040519150601f19603f3d011682016040523d82523d5f602084013e62002b9f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024039085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002627565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002c7a919062003ece565b5f60405180830381855afa9150503d805f811462002cb4576040519150601f19603f3d011682016040523d82523d5f602084013e62002cb9565b606091505b50915091508162002d00576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250620021bd565b620021bd8162003305565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002d81919062003ece565b5f60405180830381855afa9150503d805f811462002dbb576040519150601f19603f3d011682016040523d82523d5f602084013e62002dc0565b606091505b50915091508162002d00576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250620021bd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002e7c919062003ece565b5f60405180830381855afa9150503d805f811462002eb6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ebb565b606091505b509150915081801562002ecf575080516020145b62002edc576012620021bd565b80806020019051810190620021bd919062004376565b80600162002f0360206002620044cb565b62002f0f9190620040d8565b6053541062002f4a576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002f5b9062003d69565b918290555090505f5b602081101562002ff6578082901c60011660010362002f9c57826033826020811062002f945762002f9462003d0f565b015550505050565b6033816020811062002fb25762002fb262003d0f565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002fed9062003d69565b91505062002f64565b506200268c620044d8565b60018055565b5f54610100900460ff166200309f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b62000762620034f0565b60685460ff16620030e6576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6068545f90610100900463ffffffff161580156200315c575063ffffffff82166001145b1562003170575063ffffffff82166200319c565b6200318764010000000063ffffffff841662003e62565b620031999063ffffffff851662003e7c565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620019fa576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003256826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620035889092919063ffffffff16565b8051909150156200268c578080602001905181019062003277919062004505565b6200268c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001ac6565b60606040825110620033275781806020019051810190620007f3919062004523565b8151602003620034b2575f5b6020811080156200337e575082818151811062003354576200335462003d0f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033995780620033908162003d69565b91505062003333565b805f03620033dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620033f957620033f962003ea1565b6040519080825280601f01601f19166020018201604052801562003424576020820181803683370190505b5090505f5b82811015620034aa5784818151811062003447576200344762003d0f565b602001015160f81c60f81b82828151811062003467576200346762003d0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034a18162003d69565b91505062003429565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b5f54610100900460ff1662003001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b6060620021bd84845f85855f80866001600160a01b03168587604051620035b0919062003ece565b5f6040518083038185875af1925050503d805f8114620035ec576040519150601f19603f3d011682016040523d82523d5f602084013e620035f1565b606091505b509150915062003604878383876200360f565b979650505050505050565b606083156200369c5782515f0362003694576001600160a01b0385163b62003694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ac6565b5081620021bd565b620021bd8383815115620036b35781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ac691906200459e565b6119a180620045b383390190565b803563ffffffff81168114620034eb575f80fd5b6001600160a01b038116811462003720575f80fd5b50565b5f806040838503121562003735575f80fd5b6200374083620036f7565b9150602083013562003752816200370b565b809150509250929050565b801515811462003720575f80fd5b5f8083601f8401126200377c575f80fd5b50813567ffffffffffffffff81111562003794575f80fd5b602083019150836020828501011115620037ac575f80fd5b9250929050565b5f805f805f60808688031215620037c8575f80fd5b620037d386620036f7565b94506020860135620037e5816200370b565b93506040860135620037f7816200375d565b9250606086013567ffffffffffffffff81111562003813575f80fd5b62003821888289016200376b565b969995985093965092949392505050565b5f6020828403121562003843575f80fd5b813562003850816200370b565b9392505050565b60ff8116811462003720575f80fd5b5f805f805f805f60e0888a0312156200387d575f80fd5b87356200388a8162003857565b96506200389a60208901620036f7565b95506040880135620038ac816200370b565b9450620038bc60608901620036f7565b93506080880135620038ce816200370b565b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215620038fc575f80fd5b5035919050565b806104008101831015620007f3575f80fd5b5f805f610440848603121562003929575f80fd5b833592506200393c856020860162003903565b91506200394d6104208501620036f7565b90509250925092565b5f805f805f805f60a0888a0312156200396d575f80fd5b6200397888620036f7565b965060208801356200398a816200370b565b9550604088013567ffffffffffffffff80821115620039a7575f80fd5b620039b58b838c016200376b565b909750955060608a0135915080821115620039ce575f80fd5b50620039dd8a828b016200376b565b9094509250506080880135620039f38162003857565b8091505092959891949750929550565b5f805f805f8060a0878903121562003a19575f80fd5b62003a2487620036f7565b9550602087013562003a36816200370b565b945060408701359350606087013562003a4f816200375d565b9250608087013567ffffffffffffffff81111562003a6b575f80fd5b62003a7989828a016200376b565b979a9699509497509295939492505050565b5f806040838503121562003a9d575f80fd5b62003aa883620036f7565b915062003ab860208401620036f7565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562003ade575f80fd5b62003aea8e8e62003903565b9b5062003afc8e6104008f0162003903565b9a506108008d013599506108208d013598506108408d0135975062003b256108608e01620036f7565b965062003b376108808e01356200370b565b6108808d0135955062003b4e6108a08e01620036f7565b945062003b606108c08e01356200370b565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003b8a575f80fd5b62003b9d8e6109008f01358f016200376b565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562003bcc575f80fd5b62003bd788620036f7565b9650602088013562003be9816200370b565b955060408801359450606088013562003c02816200370b565b9350608088013562003c14816200375d565b925060a088013567ffffffffffffffff81111562003c30575f80fd5b62003c3e8a828b016200376b565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562003c66575f80fd5b62003c7186620036f7565b9450602086013562003c83816200370b565b935062003c9360408701620036f7565b9250606086013562003ca5816200370b565b9150608086013562003cb7816200370b565b809150509295509295909350565b5f805f80610460858703121562003cda575f80fd5b8435935062003ced866020870162003903565b925062003cfe6104208601620036f7565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003d9c5762003d9c62003d3c565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b606081525f62003de160608301878962003da3565b828103602084015262003df681868862003da3565b91505060ff831660408301529695505050505050565b5f5b8381101562003e2857818101518382015260200162003e0e565b50505f910152565b5f835162003e4381846020880162003e0c565b83519083019062003e5981836020880162003e0c565b01949350505050565b8082028115828204841417620007f357620007f362003d3c565b80820180821115620007f357620007f362003d3c565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f825162003ee181846020870162003e0c565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562003f175762003f1762003ea1565b604052919050565b5f67ffffffffffffffff82111562003f3b5762003f3b62003ea1565b50601f01601f191660200190565b5f82601f83011262003f59575f80fd5b813562003f7062003f6a8262003f1f565b62003eeb565b81815284602083860101111562003f85575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003fb4575f80fd5b833567ffffffffffffffff8082111562003fcc575f80fd5b62003fda8783880162003f49565b9450602086013591508082111562003ff0575f80fd5b5062003fff8682870162003f49565b9250506040840135620040128162003857565b809150509250925092565b5f81518084526200403681602086016020860162003e0c565b601f01601f19169290920160200192915050565b606081525f6200405e60608301866200401d565b82810360208401526200407281866200401d565b91505060ff83166040830152949350505050565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200360460808301848662003da3565b5f60208284031215620040d1575f80fd5b5051919050565b81810381811115620007f357620007f362003d3c565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262004140828501876200401d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6200418960608301848662003da3565b9695505050505050565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620041e6828501878962003da3565b925080851660e085015250509a9950505050505050505050565b63ffffffff81811683821601908082111562004220576200422062003d3c565b5092915050565b5f808585111562004236575f80fd5b8386111562004243575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042915780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620042b0575f80fd5b8735620042bd816200370b565b96506020880135620042cf816200370b565b955060408801359450606088013593506080880135620038ce8162003857565b5f805f805f805f80610100898b03121562004308575f80fd5b883562004315816200370b565b9750602089013562004327816200370b565b96506040890135955060608901359450608089013562004347816200375d565b935060a0890135620043598162003857565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004387575f80fd5b8151620038508162003857565b600181815b80851115620043f357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620043d757620043d762003d3c565b80851615620043e557918102915b93841c939080029062004399565b509250929050565b5f826200440b57506001620007f3565b816200441957505f620007f3565b81600181146200443257600281146200443d576200445d565b6001915050620007f3565b60ff84111562004451576200445162003d3c565b50506001821b620007f3565b5060208310610133831016604e8410600b841016171562004482575081810a620007f3565b6200448e838362004394565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620044c357620044c362003d3c565b029392505050565b5f620038508383620043fb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004516575f80fd5b815162003850816200375d565b5f6020828403121562004534575f80fd5b815167ffffffffffffffff8111156200454b575f80fd5b8201601f810184136200455c575f80fd5b80516200456d62003f6a8262003f1f565b81815285602083850101111562004582575f80fd5b6200459582602083016020860162003e0c565b95945050505050565b602081525f6200385060208301846200401d56fe61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033a26469706673582212209002ffc0c7cb9056d22d47ac65cf05714a8ae8ce0af7e882f7e68b9fdede830e64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json index 08bcf6da5..a2d289423 100644 --- a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json +++ b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json @@ -19,11 +19,6 @@ "stateMutability": "nonpayable", "type": "constructor" }, - { - "inputs": [], - "name": "MerkleTreeFull", - "type": "error" - }, { "inputs": [], "name": "OnlyAllowedContracts", @@ -61,48 +56,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "leafHash", - "type": "bytes32" - }, - { - "internalType": "bytes32[32]", - "name": "smtProof", - "type": "bytes32[32]" - }, - { - "internalType": "uint32", - "name": "index", - "type": "uint32" - } - ], - "name": "calculateRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "depositCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "getLastGlobalExitRoot", @@ -116,19 +69,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -199,44 +139,10 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "leafHash", - "type": "bytes32" - }, - { - "internalType": "bytes32[32]", - "name": "smtProof", - "type": "bytes32[32]" - }, - { - "internalType": "uint32", - "name": "index", - "type": "uint32" - }, - { - "internalType": "bytes32", - "name": "root", - "type": "bytes32" - } - ], - "name": "verifyMerkleProof", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" } ], - "bytecode": "0x60c060405234801561000f575f80fd5b50604051610aa2380380610aa283398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516109e26100c05f395f818161013f015261024901525f818161019e015261020001526109e25ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c80633ed691ef1161007d57806383f244031161005857806383f2440314610186578063a3c573eb14610199578063fb570834146101c0575f80fd5b80633ed691ef1461012a5780635ca1e165146101325780635ec6a8df1461013a575f80fd5b80632dfdf0b5116100ad5780632dfdf0b514610103578063319cf7351461010c57806333d6247d14610115575f80fd5b806301fd9044146100c8578063257b3632146100e4575b5f80fd5b6100d1602b5481565b6040519081526020015b60405180910390f35b6100d16100f23660046106ea565b602d6020525f908152604090205481565b6100d160205481565b6100d1602c5481565b6101286101233660046106ea565b6101e3565b005b6100d1610318565b6100d161032c565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100db565b6100d161019436600461072a565b610335565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b6101d36101ce366004610766565b61040a565b60405190151581526020016100db565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102325750602c829055816102ae565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361027c57602b8390558291506102ae565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102b982846104e2565b5f818152602d602052604081205491925003610312575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361031281610511565b50505050565b5f610327602c54602b546104e2565b905090565b5f61032761060f565b5f83815b602081101561040157600163ffffffff8516821c811690036103a457848160208110610367576103676107ab565b602002013582604051602001610387929190918252602082015260400190565b6040516020818303038152906040528051906020012091506103ef565b818582602081106103b7576103b76107ab565b60200201356040516020016103d6929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806103f981610805565b915050610339565b50949350505050565b5f84815b60208110156104d657600163ffffffff8616821c811690036104795785816020811061043c5761043c6107ab565b60200201358260405160200161045c929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104c4565b8186826020811061048c5761048c6107ab565b60200201356040516020016104ab929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104ce81610805565b91505061040e565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b8060016105206020600261095a565b61052a919061096c565b60205410610564576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f815461057390610805565b918290555090505f5b6020811015610601578082901c6001166001036105ae57825f82602081106105a6576105a66107ab565b015550505050565b5f81602081106105c0576105c06107ab565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806105f990610805565b91505061057c565b5061060a61097f565b505050565b6020545f90819081805b60208110156106e1578083901c600116600103610675575f8160208110610642576106426107ab565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106a2565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106d990610805565b915050610619565b50919392505050565b5f602082840312156106fa575f80fd5b5035919050565b80610400810183101561050b575f80fd5b803563ffffffff81168114610725575f80fd5b919050565b5f805f610440848603121561073d575f80fd5b8335925061074e8560208601610701565b915061075d6104208501610712565b90509250925092565b5f805f80610460858703121561077a575f80fd5b8435935061078b8660208701610701565b925061079a6104208601610712565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610835576108356107d8565b5060010190565b600181815b8085111561089557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561087b5761087b6107d8565b8085161561088857918102915b93841c9390800290610841565b509250929050565b5f826108ab5750600161050b565b816108b757505f61050b565b81600181146108cd57600281146108d7576108f3565b600191505061050b565b60ff8411156108e8576108e86107d8565b50506001821b61050b565b5060208310610133831016604e8410600b8410161715610916575081810a61050b565b610920838361083c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610952576109526107d8565b029392505050565b5f610965838361089d565b9392505050565b8181038181111561050b5761050b6107d8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220620178600a1135c1880ab6872ead11bab365c627812a5c5944b802aa54e9004364736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100c4575f3560e01c80633ed691ef1161007d57806383f244031161005857806383f2440314610186578063a3c573eb14610199578063fb570834146101c0575f80fd5b80633ed691ef1461012a5780635ca1e165146101325780635ec6a8df1461013a575f80fd5b80632dfdf0b5116100ad5780632dfdf0b514610103578063319cf7351461010c57806333d6247d14610115575f80fd5b806301fd9044146100c8578063257b3632146100e4575b5f80fd5b6100d1602b5481565b6040519081526020015b60405180910390f35b6100d16100f23660046106ea565b602d6020525f908152604090205481565b6100d160205481565b6100d1602c5481565b6101286101233660046106ea565b6101e3565b005b6100d1610318565b6100d161032c565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100db565b6100d161019436600461072a565b610335565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b6101d36101ce366004610766565b61040a565b60405190151581526020016100db565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102325750602c829055816102ae565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361027c57602b8390558291506102ae565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102b982846104e2565b5f818152602d602052604081205491925003610312575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361031281610511565b50505050565b5f610327602c54602b546104e2565b905090565b5f61032761060f565b5f83815b602081101561040157600163ffffffff8516821c811690036103a457848160208110610367576103676107ab565b602002013582604051602001610387929190918252602082015260400190565b6040516020818303038152906040528051906020012091506103ef565b818582602081106103b7576103b76107ab565b60200201356040516020016103d6929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806103f981610805565b915050610339565b50949350505050565b5f84815b60208110156104d657600163ffffffff8616821c811690036104795785816020811061043c5761043c6107ab565b60200201358260405160200161045c929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104c4565b8186826020811061048c5761048c6107ab565b60200201356040516020016104ab929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104ce81610805565b91505061040e565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b8060016105206020600261095a565b61052a919061096c565b60205410610564576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f815461057390610805565b918290555090505f5b6020811015610601578082901c6001166001036105ae57825f82602081106105a6576105a66107ab565b015550505050565b5f81602081106105c0576105c06107ab565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806105f990610805565b91505061057c565b5061060a61097f565b505050565b6020545f90819081805b60208110156106e1578083901c600116600103610675575f8160208110610642576106426107ab565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106a2565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106d990610805565b915050610619565b50919392505050565b5f602082840312156106fa575f80fd5b5035919050565b80610400810183101561050b575f80fd5b803563ffffffff81168114610725575f80fd5b919050565b5f805f610440848603121561073d575f80fd5b8335925061074e8560208601610701565b915061075d6104208501610712565b90509250925092565b5f805f80610460858703121561077a575f80fd5b8435935061078b8660208701610701565b925061079a6104208601610712565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610835576108356107d8565b5060010190565b600181815b8085111561089557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561087b5761087b6107d8565b8085161561088857918102915b93841c9390800290610841565b509250929050565b5f826108ab5750600161050b565b816108b757505f61050b565b81600181146108cd57600281146108d7576108f3565b600191505061050b565b60ff8411156108e8576108e86107d8565b50506001821b61050b565b5060208310610133831016604e8410600b8410161715610916575081810a61050b565b610920838361083c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610952576109526107d8565b029392505050565b5f610965838361089d565b9392505050565b8181038181111561050b5761050b6107d8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220620178600a1135c1880ab6872ead11bab365c627812a5c5944b802aa54e9004364736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b506040516103e13803806103e183398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103226100bf5f395f818160e301526101b601525f818161012f015261016d01526103225ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json index 1ddb328bc..6bde95a70 100644 --- a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json +++ b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json @@ -19,11 +19,6 @@ "stateMutability": "nonpayable", "type": "constructor" }, - { - "inputs": [], - "name": "MerkleTreeFull", - "type": "error" - }, { "inputs": [], "name": "OnlyAllowedContracts", @@ -61,48 +56,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "leafHash", - "type": "bytes32" - }, - { - "internalType": "bytes32[32]", - "name": "smtProof", - "type": "bytes32[32]" - }, - { - "internalType": "uint32", - "name": "index", - "type": "uint32" - } - ], - "name": "calculateRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "depositCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "getLastGlobalExitRoot", @@ -116,19 +69,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -230,44 +170,10 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "leafHash", - "type": "bytes32" - }, - { - "internalType": "bytes32[32]", - "name": "smtProof", - "type": "bytes32[32]" - }, - { - "internalType": "uint32", - "name": "index", - "type": "uint32" - }, - { - "internalType": "bytes32", - "name": "root", - "type": "bytes32" - } - ], - "name": "verifyMerkleProof", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" } ], - "bytecode": "0x60c060405234801561000f575f80fd5b50604051610b29380380610b2983398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a051610a696100c05f395f818161018701526102b001525f81816101e601526102670152610a695ff3fe608060405234801561000f575f80fd5b50600436106100da575f3560e01c80633ed691ef116100885780635ec6a8df116100635780635ec6a8df1461018257806383f24403146101ce578063a3c573eb146101e1578063fb57083414610208575f80fd5b80633ed691ef146101535780635bcef6731461015b5780635ca1e1651461017a575f80fd5b80632dfdf0b5116100b85780632dfdf0b51461012e578063319cf7351461013757806333d6247d14610140575f80fd5b806301fd9044146100de578063051a9e28146100fa578063257b36321461010f575b5f80fd5b6100e7602b5481565b6040519081526020015b60405180910390f35b61010d610108366004610751565b61022b565b005b6100e761011d366004610751565b602d6020525f908152604090205481565b6100e760205481565b6100e7602c5481565b61010d61014e366004610751565b61024a565b6100e761037f565b61010d610169366004610768565b5f918252602d602052604090912055565b6100e7610393565b6101a97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f1565b6100e76101dc3660046107b1565b61039c565b6101a97f000000000000000000000000000000000000000000000000000000000000000081565b61021b6102163660046107ed565b610471565b60405190151581526020016100f1565b80602d5f61023761037f565b815260208101919091526040015f205550565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102995750602c82905581610315565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102e357602b839055829150610315565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6103208284610549565b5f818152602d602052604081205491925003610379575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361037981610578565b50505050565b5f61038e602c54602b54610549565b905090565b5f61038e610676565b5f83815b602081101561046857600163ffffffff8516821c8116900361040b578481602081106103ce576103ce610832565b6020020135826040516020016103ee929190918252602082015260400190565b604051602081830303815290604052805190602001209150610456565b8185826020811061041e5761041e610832565b602002013560405160200161043d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104608161088c565b9150506103a0565b50949350505050565b5f84815b602081101561053d57600163ffffffff8616821c811690036104e0578581602081106104a3576104a3610832565b6020020135826040516020016104c3929190918252602082015260400190565b60405160208183030381529060405280519060200120915061052b565b818682602081106104f3576104f3610832565b6020020135604051602001610512929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806105358161088c565b915050610475565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b806001610587602060026109e1565b61059191906109f3565b602054106105cb576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f81546105da9061088c565b918290555090505f5b6020811015610668578082901c60011660010361061557825f826020811061060d5761060d610832565b015550505050565b5f816020811061062757610627610832565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806106609061088c565b9150506105e3565b50610671610a06565b505050565b6020545f90819081805b6020811015610748578083901c6001166001036106dc575f81602081106106a9576106a9610832565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610709565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806107409061088c565b915050610680565b50919392505050565b5f60208284031215610761575f80fd5b5035919050565b5f8060408385031215610779575f80fd5b50508035926020909101359150565b806104008101831015610572575f80fd5b803563ffffffff811681146107ac575f80fd5b919050565b5f805f61044084860312156107c4575f80fd5b833592506107d58560208601610788565b91506107e46104208501610799565b90509250925092565b5f805f806104608587031215610801575f80fd5b843593506108128660208701610788565b92506108216104208601610799565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108bc576108bc61085f565b5060010190565b600181815b8085111561091c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109025761090261085f565b8085161561090f57918102915b93841c93908002906108c8565b509250929050565b5f8261093257506001610572565b8161093e57505f610572565b8160018114610954576002811461095e5761097a565b6001915050610572565b60ff84111561096f5761096f61085f565b50506001821b610572565b5060208310610133831016604e8410600b841016171561099d575081810a610572565b6109a783836108c3565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109d9576109d961085f565b029392505050565b5f6109ec8383610924565b9392505050565b818103818111156105725761057261085f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220a98316094c188d66989b6db4315ee6329349bd8b58d17fd810172d0b0fb51ee264736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100da575f3560e01c80633ed691ef116100885780635ec6a8df116100635780635ec6a8df1461018257806383f24403146101ce578063a3c573eb146101e1578063fb57083414610208575f80fd5b80633ed691ef146101535780635bcef6731461015b5780635ca1e1651461017a575f80fd5b80632dfdf0b5116100b85780632dfdf0b51461012e578063319cf7351461013757806333d6247d14610140575f80fd5b806301fd9044146100de578063051a9e28146100fa578063257b36321461010f575b5f80fd5b6100e7602b5481565b6040519081526020015b60405180910390f35b61010d610108366004610751565b61022b565b005b6100e761011d366004610751565b602d6020525f908152604090205481565b6100e760205481565b6100e7602c5481565b61010d61014e366004610751565b61024a565b6100e761037f565b61010d610169366004610768565b5f918252602d602052604090912055565b6100e7610393565b6101a97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f1565b6100e76101dc3660046107b1565b61039c565b6101a97f000000000000000000000000000000000000000000000000000000000000000081565b61021b6102163660046107ed565b610471565b60405190151581526020016100f1565b80602d5f61023761037f565b815260208101919091526040015f205550565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102995750602c82905581610315565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102e357602b839055829150610315565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6103208284610549565b5f818152602d602052604081205491925003610379575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361037981610578565b50505050565b5f61038e602c54602b54610549565b905090565b5f61038e610676565b5f83815b602081101561046857600163ffffffff8516821c8116900361040b578481602081106103ce576103ce610832565b6020020135826040516020016103ee929190918252602082015260400190565b604051602081830303815290604052805190602001209150610456565b8185826020811061041e5761041e610832565b602002013560405160200161043d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104608161088c565b9150506103a0565b50949350505050565b5f84815b602081101561053d57600163ffffffff8616821c811690036104e0578581602081106104a3576104a3610832565b6020020135826040516020016104c3929190918252602082015260400190565b60405160208183030381529060405280519060200120915061052b565b818682602081106104f3576104f3610832565b6020020135604051602001610512929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806105358161088c565b915050610475565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b806001610587602060026109e1565b61059191906109f3565b602054106105cb576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f81546105da9061088c565b918290555090505f5b6020811015610668578082901c60011660010361061557825f826020811061060d5761060d610832565b015550505050565b5f816020811061062757610627610832565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806106609061088c565b9150506105e3565b50610671610a06565b505050565b6020545f90819081805b6020811015610748578083901c6001166001036106dc575f81602081106106a9576106a9610832565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610709565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806107409061088c565b915050610680565b50919392505050565b5f60208284031215610761575f80fd5b5035919050565b5f8060408385031215610779575f80fd5b50508035926020909101359150565b806104008101831015610572575f80fd5b803563ffffffff811681146107ac575f80fd5b919050565b5f805f61044084860312156107c4575f80fd5b833592506107d58560208601610788565b91506107e46104208501610799565b90509250925092565b5f805f806104608587031215610801575f80fd5b843593506108128660208701610788565b92506108216104208601610799565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108bc576108bc61085f565b5060010190565b600181815b8085111561091c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109025761090261085f565b8085161561090f57918102915b93841c93908002906108c8565b509250929050565b5f8261093257506001610572565b8161093e57505f610572565b8160018114610954576002811461095e5761097a565b6001915050610572565b60ff84111561096f5761096f61085f565b50506001821b610572565b5060208310610133831016604e8410600b841016171561099d575081810a610572565b6109a783836108c3565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109d9576109d961085f565b029392505050565b5f6109ec8383610924565b9392505050565b818103818111156105725761057261085f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220a98316094c188d66989b6db4315ee6329349bd8b58d17fd810172d0b0fb51ee264736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b5060405161047838038061047883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103b86100c05f395f818161013a015261022c01525f818161018601526101e301526103b85ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json b/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json new file mode 100644 index 000000000..966061935 --- /dev/null +++ b/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json @@ -0,0 +1,148 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMGlobalExitRootV2", + "sourceName": "contracts/v2/PolygonZkEVMGlobalExitRootV2.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_rollupManager", + "type": "address" + }, + { + "internalType": "address", + "name": "_bridgeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "OnlyAllowedContracts", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "mainnetExitRoot", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "rollupExitRoot", + "type": "bytes32" + } + ], + "name": "UpdateGlobalExitRoot", + "type": "event" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastGlobalExitRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "globalExitRootMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastMainnetExitRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastRollupExitRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rollupManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "newRoot", + "type": "bytes32" + } + ], + "name": "updateExitRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561000f575f80fd5b506040516103e13803806103e183398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103226100bf5f395f818160e301526101b601525f818161012f015261016d01526103225ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d657806349b7b802146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea2646970667358221220a6860101da9fdfdd9dccc38f11bb64c2a59c78d3dbf1187f9fc9e656fe3043c964736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d657806349b7b802146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea2646970667358221220a6860101da9fdfdd9dccc38f11bb64c2a59c78d3dbf1187f9fc9e656fe3043c964736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/PolygonZkEVMMock.json b/compiled-contracts/PolygonZkEVMMock.json index b2e23569d..e122b9b6b 100644 --- a/compiled-contracts/PolygonZkEVMMock.json +++ b/compiled-contracts/PolygonZkEVMMock.json @@ -746,11 +746,6 @@ "internalType": "address", "name": "sequencerAddress", "type": "address" - }, - { - "internalType": "bool", - "name": "isForced", - "type": "bool" } ], "name": "calculateAccInputHash", @@ -892,19 +887,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "gapLastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "getForcedBatchFee", @@ -1192,6 +1174,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "lastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "lastVerifiedBatch", @@ -1434,9 +1429,14 @@ }, { "internalType": "bytes32", - "name": "forcedHistoricGlobalExitRoot", + "name": "globalExitRoot", "type": "bytes32" }, + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, { "internalType": "uint64", "name": "minForcedTimestamp", @@ -1469,7 +1469,7 @@ }, { "internalType": "bytes32", - "name": "forcedHistoricGlobalExitRoot", + "name": "globalExitRoot", "type": "bytes32" }, { @@ -1478,7 +1478,7 @@ "type": "uint64" } ], - "internalType": "struct PolygonZkEVM.BatchData[]", + "internalType": "struct PolygonZkEVM.ForcedBatchData[]", "name": "batches", "type": "tuple[]" } @@ -1935,8 +1935,8 @@ "type": "function" } ], - "bytecode": "0x61014060405234801562000011575f80fd5b5060405162006e4638038062006e468339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051616c4f620001f75f395f818161076101528181611a600152613e1b01525f818161099e0152611a3601525f8181610964015281816131ea015281816144ad01526158ca01525f8181610b420152818161171601528181611bd201528181611d9d015281816125c2015281816132660152818161471d015261550901525f8181610c0201528181614e7201526152c001525f8181610a6c01528181612aea01528181613817015281816146f20152614f5e0152616c4f5ff3fe608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638da5cb5b1161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c8a578063f8b823e414610caa578063fe16564f14610cb3575f80fd5b8063f14916d614610c64578063f2fde38b14610c77575f80fd5b8063e7a7ed0214610bcd578063e8bf92ed14610bfd578063eaeb077b14610c24578063ed6b010414610c37575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b8a578063dbc1697614610bb2578063e0d1744114610bba575f80fd5b8063d2e129f914610b64578063d8d1091b14610b77575f80fd5b8063c754c7ed14610acf578063c89e42df14610afb578063cfa8ed4714610b0e578063d02103ca14610b3d575f80fd5b8063adc879e9116101d8578063b6b0b097116101a8578063c00e0dc91161018e578063c00e0dc914610aa1578063c0cad30214610ab4578063c0ed84e014610ac7575f80fd5b8063b6b0b09714610a67578063ba58ae3914610a8e575f80fd5b8063adc879e914610999578063afd23cbe146109c0578063b4d63f58146109ee578063b4f77ea914610a54575f80fd5b80639b7967601161022d578063a066215c11610213578063a066215c1461094c578063a3c573eb1461095f578063ada8f91914610986575f80fd5b80639b796760146109265780639c9f3dfe14610939575f80fd5b80638da5cb5b146108da57806396dc3d39146108f857806399f5634e1461090b5780639aa972a314610913575f80fd5b80634a1a89a71161037d5780636ff512cc116102f8578063831c7ead116102c8578063841b24d7116102ae578063841b24d7146107f75780638449a79c146108275780638c3d7301146108d2575f80fd5b8063831c7ead1461075c578063837a473814610783575f80fd5b80636ff512cc1461071a578063715018a61461072d5780637215541a146107355780637fcb365314610748575f80fd5b8063542028d51161034d578063604691691161033357806360469169146106e0578063621dd411146106e85780636b8616ce146106fb575f80fd5b8063542028d5146106d05780635ec91958146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063298789831161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b806329878983146105835780632a9f208f146105af5780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e514610518578063220d78991461052b578063267822471461053e575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615f72565b610cc6565b6040519081526020016104a7565b6104d9611196565b6040516104a7919061602e565b6104f96104f436600461605d565b611222565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f96105263660046160ea565b6117d0565b6104d961053936600461610b565b6118e8565b607b5461055e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b60745461055e9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6073546104929067ffffffffffffffff1681565b6104f96105d1366004616165565b611abe565b6104f96105e43660046161c9565b611c88565b6105086105f736600461623e565b611e90565b6104f961060a36600461623e565b611ee5565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f961069936600461623e565b612069565b6104f96106ac36600461623e565b61211c565b6104c36106bf36600461623e565b60756020525f908152604090205481565b6104d96122a0565b6104f96122ad565b6104c36123ac565b6104f96106f6366004616165565b6123c1565b6104c361070936600461623e565b60716020525f908152604090205481565b6104f961072836600461627a565b61273f565b6104f9612814565b6104f961074336600461623e565b612827565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b6107cb610791366004616293565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104c361083536600461638b565b845160209586012060408051808801989098528781019190915260608088019590955260c09390931b7fffffffffffffffff000000000000000000000000000000000000000000000000166080870152921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608885015290151560f81b609c8401528051808403607d018152609d9093019052815191012090565b6104f9612994565b60335473ffffffffffffffffffffffffffffffffffffffff1661055e565b6104f961090636600461623e565b612a60565b6104c3612aa3565b6104f96109213660046161c9565b612bf6565b6104f961093436600461623e565b612ca6565b6104f961094736600461623e565b612cf5565b6104f961095a36600461623e565b612e71565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099436600461627a565b612f77565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109db906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a2e6109fc36600461623e565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6236600461623e565b61303b565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b610508610a9c366004616293565b61304c565b6104f9610aaf366004616453565b6130d4565b6104f9610ac23660046164a3565b613888565b6104926138a0565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610b093660046164a3565b6138f3565b606f5461055e906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b72366004616513565b613980565b6104f9610b853660046165be565b613ebe565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f961445a565b6104f9610bc83660046165fd565b61452e565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c32366004616647565b6145bd565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c7236600461627a565b6149ad565b6104f9610c8536600461627a565b614a7f565b607a5461055e9073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cc136600461668f565b614b33565b5f805f610cd16138a0565b905067ffffffffffffffff881615610e9d5760795467ffffffffffffffff9081169089161115610dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610da5565b50611035565b67ffffffffffffffff87165f90815260756020526040902054915081610f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610da5565b8067ffffffffffffffff168767ffffffffffffffff161115611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610da5565b8067ffffffffffffffff168667ffffffffffffffff16116110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610da5565b5f61110c88888886896118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161114091906166b9565b602060405180830381855afa15801561115b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117e91906166d4565b6111889190616718565b9a9950505050505050505050565b607780546111a39061672b565b80601f01602080910402602001604051908101604052809291908181526020018280546111cf9061672b565b801561121a5780601f106111f15761010080835404028352916020019161121a565b820191905f5260205f20905b8154815290600101906020018083116111fd57829003601f168201915b505050505081565b61122a614b55565b5f806112346138a0565b905067ffffffffffffffff8a16156113fb5760795467ffffffffffffffff908116908b16111561130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610da5565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610da5565b50611593565b67ffffffffffffffff89165f908152607560205260409020549150816114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610da5565b8067ffffffffffffffff168967ffffffffffffffff161115611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610da5565b8067ffffffffffffffff168867ffffffffffffffff161161165c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610da5565b5f61166a8a8a8a868b6118e8565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116e757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561176c575f80fd5b505af115801561177e573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611821576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183a57506103ff8161ffff16115b15611871576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f81815260726020526040808220549388168252902054606092911580159061191b575081155b15611952576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80611989576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119928461304c565b6119c8576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b1b576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b29868686868686614bd6565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611ba357607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c28575f80fd5b505af1158015611c3a573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611ce5576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cf487878787878787614f91565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6e57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611df3575f80fd5b505af1158015611e05573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ed392700100000000000000000000000000000000909204811691166167a9565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f36576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f7d576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fec5760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fec576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118dd565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461211057606f5460ff16156120d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120da81611e90565b612110576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612119816153c0565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461216d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121b4576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221f57607b5467ffffffffffffffff7401000000000000000000000000000000000000000090910481169082161061221f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118dd565b607680546111a39061672b565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1661235a576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f60705460646123bc91906167d1565b905090565b606f5460ff16156123fe576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f90815260726020526040902060010154429261244a927801000000000000000000000000000000000000000000000000909104811691166167a9565b67ffffffffffffffff16111561248c576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861249986866167e8565b67ffffffffffffffff1611156124db576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124e9868686868686614bd6565b6124f2846155cd565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361263357607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f908152607560205260409020839055607954161561259357607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612618575f80fd5b505af115801561262a573d5f803e3d5ffd5b50505050612701565b61263b6157a7565b6079805467ffffffffffffffff16905f61265483616809565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c78565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612790576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118dd565b61281c614b55565b6128255f615852565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461298c575f61284f6138a0565b90508067ffffffffffffffff168267ffffffffffffffff161161289e576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806128e3575067ffffffffffffffff8083165f9081526072602052604090206001015416155b1561291a576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916129489162093a8091166167a9565b67ffffffffffffffff16111561298a576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6121196158c8565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146129e5576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b612a68614b55565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612b2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5391906166d4565b90505f612b5e6138a0565b60735467ffffffffffffffff680100000000000000008204811691612bb691700100000000000000000000000000000000820481169178010000000000000000000000000000000000000000000000009004166167e8565b612bc091906167a9565b612bca91906167e8565b67ffffffffffffffff169050805f03612be5575f9250505090565b612bef818361682f565b9250505090565b606f5460ff1615612c33576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c4287878787878787614f91565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612c9d6158c8565b50505050505050565b612cae614b55565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612d46576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612d8d576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16612df45760795467ffffffffffffffff700100000000000000000000000000000000909104811690821610612df4576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118dd565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612ec2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612f09576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118dd565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fc8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118dd565b613043614b55565b612119816155cd565b5f67ffffffff0000000167ffffffffffffffff8316108015613083575067ffffffff00000001604083901c67ffffffffffffffff16105b80156130a4575067ffffffff00000001608083901c67ffffffffffffffff16105b80156130bb575067ffffffff0000000160c083901c105b156130c857506001919050565b505f919050565b919050565b606f5460ff1615613111576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314613171576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036131ac576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156131e8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561324d575f80fd5b505af115801561325f573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132f191906166d4565b60735467ffffffffffffffff68010000000000000000820481165f818152607260205260408120549495504294919370010000000000000000000000000000000090049092169182905b87811015613647575f8b8b8381811061335657613356616842565b9050602002810190613368919061686f565b613371906168a1565b8051805160209091012060408201519192509067ffffffffffffffff1615613562578561339d81616809565b9650505f81836020015184604001516040516020016133f493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526071909352912054909150811461347c576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015181519384018a905290830185905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120955060715f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550613632565b8151516201d4c010156135a1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018b905260c08a901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c820152609d016040516020818303038152906040528051906020012094505b5050808061363f9061691a565b91505061333b565b5061365287856167a9565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156136bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060810182528381524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528b86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217948416830294909417905582547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1693029290921790558790828116908516146137ed5761378f82856167e8565b6137a39067ffffffffffffffff1682616951565b607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff88160217905590505b61383f33308360705461380091906167d1565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061594b565b6138476157a7565b60405167ffffffffffffffff8616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a25050505050505050505050565b613890614b55565b607761389c82826169b1565b5050565b6079545f9067ffffffffffffffff16156138e2575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613944576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661395082826169b1565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118dd919061602e565b5f54610100900460ff161580801561399e57505f54600160ff909116105b806139b75750303b1580156139b757505f5460ff166001145b613a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610da5565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613a9f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613aac602088018861627a565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b01604088016020890161627a565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613b66608088016060890161627a565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613bf086826169b1565b506077613bfd85826169b1565b5062093a80613c126060890160408a0161623e565b67ffffffffffffffff161115613c54576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c64606088016040890161623e565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613cc660a0890160808a0161623e565b67ffffffffffffffff161115613d08576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d1860a088016080890161623e565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613df7615a2d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e4c9493929190616b10565b60405180910390a18015612c9d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f1b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f58576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613f93576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613fcf576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161401a918491700100000000000000000000000000000000900416616b47565b1115614052576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614321575f8787838181106140b0576140b0616842565b90506020028101906140c2919061686f565b6140cb906168a1565b9050836140d781616809565b825180516020918201208185015160408087015190519499509194505f936141389386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556141e4600189616951565b84036142535742607b60149054906101000a900467ffffffffffffffff16846040015161421191906167a9565b67ffffffffffffffff161115614253576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083810151604080860151815193840189905290830185905260608084019290925260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120945050505080806143199061691a565b915050614095565b5061432c84846167a9565b6040805160608101825283815267ffffffffffffffff428116602080840191825260738054680100000000000000009081900485168688019081528589165f8181526072909552888520975188559451600190970180549151871683027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921697871697909717179095558054938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958402959095167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9094169390931793909317909155915192955090917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144ab576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614510575f80fd5b505af1158015614522573d5f803e3d5ffd5b50505050612825615acc565b614536614b55565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561461a576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614657576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6146606123ac565b90508181111561469c576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156146d8576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61471a73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461594b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015614784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147a891906166d4565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186147e283616809565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614819929190616b5a565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614947576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149a6565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161499d9493929190616b69565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146149fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118dd565b614a87614b55565b73ffffffffffffffffffffffffffffffffffffffff8116614b2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610da5565b61211981615852565b614b3b614b55565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610da5565b5f80614be06138a0565b905067ffffffffffffffff881615614caf5760795467ffffffffffffffff9081169089161115614c3c576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ca9576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d4f565b67ffffffffffffffff87165f90815260756020526040902054915081614d01576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d4f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614d9c576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614daa88888886896118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614dde91906166b9565b602060405180830381855afa158015614df9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e1c91906166d4565b614e269190616718565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ea891899190600401616b9e565b602060405180830381865afa158015614ec3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ee79190616bd8565b614f1d576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f8533614f2b858b6167e8565b67ffffffffffffffff16614f3d612aa3565b614f4791906167d1565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b5a565b50505050505050505050565b5f67ffffffffffffffff88161561505d5760795467ffffffffffffffff9081169089161115614fec576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615057576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506150f8565b5067ffffffffffffffff85165f90815260756020526040902054806150ae576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156150f8576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061512a57508767ffffffffffffffff168767ffffffffffffffff1611155b80615151575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615188576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146151ea576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6151f887878785886118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161522c91906166b9565b602060405180830381855afa158015615247573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061526a91906166d4565b6152749190616718565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916152f691889190600401616b9e565b602060405180830381865afa158015615311573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906153359190616bd8565b61536b576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614f85576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806153fa575060795467ffffffffffffffff908116908216115b15615431576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561555f575f80fd5b505af1158015615571573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155c091815260200190565b60405180910390a3505050565b5f6155d66138a0565b9050815f806155e584846167e8565b606f5467ffffffffffffffff91821692505f916156089161010090041642616951565b90505b8467ffffffffffffffff168467ffffffffffffffff16146156925767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561567057600181015468010000000000000000900467ffffffffffffffff16945061568c565b61567a86866167e8565b67ffffffffffffffff16935050615692565b5061560b565b5f61569d8484616951565b9050838110156156f457808403600c81116156b857806156bb565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816156ea576156ea6166eb565b0460705550615763565b838103600c81116157055780615708565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161573e5761573e6166eb565b04905080607054670de0b6b3a7640000028161575c5761575c6166eb565b0460705550505b683635c9adc5dea00000607054111561578857683635c9adc5dea00000607055612c9d565b633b9aca006070541015612c9d57633b9aca0060705550505050505050565b60795467ffffffffffffffff680100000000000000008204811691161115612825576079545f906157ef9068010000000000000000900467ffffffffffffffff1660016167a9565b90506157fa81611e90565b15612119576079545f9060029061581c90849067ffffffffffffffff166167e8565b6158269190616bf3565b61583090836167a9565b905061583b81611e90565b156158495761389c816153c0565b61389c826153c0565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561592d575f80fd5b505af115801561593f573d5f803e3d5ffd5b50505050612825615bb5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052615a279085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615c47565b50505050565b5f54610100900460ff16615ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610da5565b61282533615852565b606f5460ff16615b08576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bb09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016159a5565b505050565b606f5460ff1615615bf2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f615ca8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d529092919063ffffffff16565b805190915015615bb05780806020019051810190615cc69190616bd8565b615bb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610da5565b6060615d6084845f85615d68565b949350505050565b606082471015615dfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610da5565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e2291906166b9565b5f6040518083038185875af1925050503d805f8114615e5c576040519150601f19603f3d011682016040523d82523d5f602084013e615e61565b606091505b5091509150615e7287838387615e7d565b979650505050505050565b60608315615f125782515f03615f0b5773ffffffffffffffffffffffffffffffffffffffff85163b615f0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610da5565b5081615d60565b615d608383815115615f275781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5919061602e565b803567ffffffffffffffff811681146130cf575f80fd5b5f805f805f60a08688031215615f86575f80fd5b615f8f86615f5b565b9450615f9d60208701615f5b565b9350615fab60408701615f5b565b94979396509394606081013594506080013592915050565b5f5b83811015615fdd578181015183820152602001615fc5565b50505f910152565b5f8151808452615ffc816020860160208601615fc3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6160406020830184615fe5565b9392505050565b8060408101831015616057575f80fd5b92915050565b5f805f805f805f806101a0898b031215616075575f80fd5b61607e89615f5b565b975061608c60208a01615f5b565b965061609a60408a01615f5b565b955060608901359450608089013593506160b78a60a08b01616047565b925061016089018a8111156160ca575f80fd5b60e08a0192506160da8b82616047565b9150509295985092959890939650565b5f602082840312156160fa575f80fd5b813561ffff81168114616040575f80fd5b5f805f805f60a0868803121561611f575f80fd5b61612886615f5b565b945061613660208701615f5b565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616057575f80fd5b5f805f805f806103a0878903121561617b575f80fd5b61618487615f5b565b955061619260208801615f5b565b94506161a060408801615f5b565b935060608701359250608087013591506161bd8860a08901616154565b90509295509295509295565b5f805f805f805f6103c0888a0312156161e0575f80fd5b6161e988615f5b565b96506161f760208901615f5b565b955061620560408901615f5b565b945061621360608901615f5b565b93506080880135925060a088013591506162308960c08a01616154565b905092959891949750929550565b5f6020828403121561624e575f80fd5b61604082615f5b565b803573ffffffffffffffffffffffffffffffffffffffff811681146130cf575f80fd5b5f6020828403121561628a575f80fd5b61604082616257565b5f602082840312156162a3575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162e6575f80fd5b813567ffffffffffffffff80821115616301576163016162aa565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715616347576163476162aa565b8160405283815286602085880101111561635f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b8015158114612119575f80fd5b5f805f805f8060c087890312156163a0575f80fd5b86359550602087013567ffffffffffffffff8111156163bd575f80fd5b6163c989828a016162d7565b955050604087013593506163df60608801615f5b565b92506163ed60808801616257565b915060a08701356163fd8161637e565b809150509295509295509295565b5f8083601f84011261641b575f80fd5b50813567ffffffffffffffff811115616432575f80fd5b6020830191508360208260051b850101111561644c575f80fd5b9250929050565b5f805f60408486031215616465575f80fd5b833567ffffffffffffffff81111561647b575f80fd5b6164878682870161640b565b909450925061649a905060208501616257565b90509250925092565b5f602082840312156164b3575f80fd5b813567ffffffffffffffff8111156164c9575f80fd5b615d60848285016162d7565b5f8083601f8401126164e5575f80fd5b50813567ffffffffffffffff8111156164fc575f80fd5b60208301915083602082850101111561644c575f80fd5b5f805f805f8086880361012081121561652a575f80fd5b60a0811215616537575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561655c575f80fd5b6165688a838b016162d7565b955060e089013591508082111561657d575f80fd5b6165898a838b016162d7565b945061010089013591508082111561659f575f80fd5b506165ac89828a016164d5565b979a9699509497509295939492505050565b5f80602083850312156165cf575f80fd5b823567ffffffffffffffff8111156165e5575f80fd5b6165f18582860161640b565b90969095509350505050565b5f805f8060808587031215616610575f80fd5b61661985615f5b565b93506020850135925061662e60408601615f5b565b915061663c60608601615f5b565b905092959194509250565b5f805f60408486031215616659575f80fd5b833567ffffffffffffffff81111561666f575f80fd5b61667b868287016164d5565b909790965060209590950135949350505050565b5f80604083850312156166a0575f80fd5b823591506166b060208401615f5b565b90509250929050565b5f82516166ca818460208701615fc3565b9190910192915050565b5f602082840312156166e4575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82616726576167266166eb565b500690565b600181811c9082168061673f57607f821691505b602082108103616776577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167ca576167ca61677c565b5092915050565b80820281158282048414176160575761605761677c565b67ffffffffffffffff8281168282160390808211156167ca576167ca61677c565b5f67ffffffffffffffff8083168181036168255761682561677c565b6001019392505050565b5f8261683d5761683d6166eb565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166ca575f80fd5b5f606082360312156168b1575f80fd5b6040516060810167ffffffffffffffff82821081831117156168d5576168d56162aa565b8160405284359150808211156168e9575f80fd5b506168f6368286016162d7565b8252506020830135602082015261690f60408401615f5b565b604082015292915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361694a5761694a61677c565b5060010190565b818103818111156160575761605761677c565b601f821115615bb0575f81815260208120601f850160051c8101602086101561698a5750805b601f850160051c820191505b818110156169a957828155600101616996565b505050505050565b815167ffffffffffffffff8111156169cb576169cb6162aa565b6169df816169d9845461672b565b84616964565b602080601f831160018114616a31575f84156169fb5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169a9565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616a7d57888601518255948401946001909101908401616a5e565b5085821015616ab957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b3d606083018486616ac9565b9695505050505050565b808201808211156160575761605761677c565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b3d606083018486616ac9565b6103208101610300808584378201835f5b6001811015616bce578151835260209283019290910190600101616baf565b5050509392505050565b5f60208284031215616be8575f80fd5b81516160408161637e565b5f67ffffffffffffffff80841680616c0d57616c0d6166eb565b9216919091049291505056fea264697066735822122030d7e5b8e946812a9ca8fbe3f42e166f37589c6e0b9c47a75570b8bd2e1c9a8d64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638da5cb5b1161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c8a578063f8b823e414610caa578063fe16564f14610cb3575f80fd5b8063f14916d614610c64578063f2fde38b14610c77575f80fd5b8063e7a7ed0214610bcd578063e8bf92ed14610bfd578063eaeb077b14610c24578063ed6b010414610c37575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b8a578063dbc1697614610bb2578063e0d1744114610bba575f80fd5b8063d2e129f914610b64578063d8d1091b14610b77575f80fd5b8063c754c7ed14610acf578063c89e42df14610afb578063cfa8ed4714610b0e578063d02103ca14610b3d575f80fd5b8063adc879e9116101d8578063b6b0b097116101a8578063c00e0dc91161018e578063c00e0dc914610aa1578063c0cad30214610ab4578063c0ed84e014610ac7575f80fd5b8063b6b0b09714610a67578063ba58ae3914610a8e575f80fd5b8063adc879e914610999578063afd23cbe146109c0578063b4d63f58146109ee578063b4f77ea914610a54575f80fd5b80639b7967601161022d578063a066215c11610213578063a066215c1461094c578063a3c573eb1461095f578063ada8f91914610986575f80fd5b80639b796760146109265780639c9f3dfe14610939575f80fd5b80638da5cb5b146108da57806396dc3d39146108f857806399f5634e1461090b5780639aa972a314610913575f80fd5b80634a1a89a71161037d5780636ff512cc116102f8578063831c7ead116102c8578063841b24d7116102ae578063841b24d7146107f75780638449a79c146108275780638c3d7301146108d2575f80fd5b8063831c7ead1461075c578063837a473814610783575f80fd5b80636ff512cc1461071a578063715018a61461072d5780637215541a146107355780637fcb365314610748575f80fd5b8063542028d51161034d578063604691691161033357806360469169146106e0578063621dd411146106e85780636b8616ce146106fb575f80fd5b8063542028d5146106d05780635ec91958146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063298789831161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b806329878983146105835780632a9f208f146105af5780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e514610518578063220d78991461052b578063267822471461053e575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615f72565b610cc6565b6040519081526020016104a7565b6104d9611196565b6040516104a7919061602e565b6104f96104f436600461605d565b611222565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f96105263660046160ea565b6117d0565b6104d961053936600461610b565b6118e8565b607b5461055e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b60745461055e9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6073546104929067ffffffffffffffff1681565b6104f96105d1366004616165565b611abe565b6104f96105e43660046161c9565b611c88565b6105086105f736600461623e565b611e90565b6104f961060a36600461623e565b611ee5565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f961069936600461623e565b612069565b6104f96106ac36600461623e565b61211c565b6104c36106bf36600461623e565b60756020525f908152604090205481565b6104d96122a0565b6104f96122ad565b6104c36123ac565b6104f96106f6366004616165565b6123c1565b6104c361070936600461623e565b60716020525f908152604090205481565b6104f961072836600461627a565b61273f565b6104f9612814565b6104f961074336600461623e565b612827565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b6107cb610791366004616293565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104c361083536600461638b565b845160209586012060408051808801989098528781019190915260608088019590955260c09390931b7fffffffffffffffff000000000000000000000000000000000000000000000000166080870152921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608885015290151560f81b609c8401528051808403607d018152609d9093019052815191012090565b6104f9612994565b60335473ffffffffffffffffffffffffffffffffffffffff1661055e565b6104f961090636600461623e565b612a60565b6104c3612aa3565b6104f96109213660046161c9565b612bf6565b6104f961093436600461623e565b612ca6565b6104f961094736600461623e565b612cf5565b6104f961095a36600461623e565b612e71565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099436600461627a565b612f77565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109db906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a2e6109fc36600461623e565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6236600461623e565b61303b565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b610508610a9c366004616293565b61304c565b6104f9610aaf366004616453565b6130d4565b6104f9610ac23660046164a3565b613888565b6104926138a0565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610b093660046164a3565b6138f3565b606f5461055e906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b72366004616513565b613980565b6104f9610b853660046165be565b613ebe565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f961445a565b6104f9610bc83660046165fd565b61452e565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c32366004616647565b6145bd565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c7236600461627a565b6149ad565b6104f9610c8536600461627a565b614a7f565b607a5461055e9073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cc136600461668f565b614b33565b5f805f610cd16138a0565b905067ffffffffffffffff881615610e9d5760795467ffffffffffffffff9081169089161115610dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610da5565b50611035565b67ffffffffffffffff87165f90815260756020526040902054915081610f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610da5565b8067ffffffffffffffff168767ffffffffffffffff161115611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610da5565b8067ffffffffffffffff168667ffffffffffffffff16116110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610da5565b5f61110c88888886896118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161114091906166b9565b602060405180830381855afa15801561115b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117e91906166d4565b6111889190616718565b9a9950505050505050505050565b607780546111a39061672b565b80601f01602080910402602001604051908101604052809291908181526020018280546111cf9061672b565b801561121a5780601f106111f15761010080835404028352916020019161121a565b820191905f5260205f20905b8154815290600101906020018083116111fd57829003601f168201915b505050505081565b61122a614b55565b5f806112346138a0565b905067ffffffffffffffff8a16156113fb5760795467ffffffffffffffff908116908b16111561130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610da5565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610da5565b50611593565b67ffffffffffffffff89165f908152607560205260409020549150816114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610da5565b8067ffffffffffffffff168967ffffffffffffffff161115611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610da5565b8067ffffffffffffffff168867ffffffffffffffff161161165c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610da5565b5f61166a8a8a8a868b6118e8565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116e757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561176c575f80fd5b505af115801561177e573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611821576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183a57506103ff8161ffff16115b15611871576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f81815260726020526040808220549388168252902054606092911580159061191b575081155b15611952576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80611989576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119928461304c565b6119c8576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b1b576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b29868686868686614bd6565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611ba357607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c28575f80fd5b505af1158015611c3a573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611ce5576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cf487878787878787614f91565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6e57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611df3575f80fd5b505af1158015611e05573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ed392700100000000000000000000000000000000909204811691166167a9565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f36576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f7d576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fec5760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fec576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118dd565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461211057606f5460ff16156120d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120da81611e90565b612110576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612119816153c0565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461216d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121b4576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221f57607b5467ffffffffffffffff7401000000000000000000000000000000000000000090910481169082161061221f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118dd565b607680546111a39061672b565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1661235a576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f60705460646123bc91906167d1565b905090565b606f5460ff16156123fe576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f90815260726020526040902060010154429261244a927801000000000000000000000000000000000000000000000000909104811691166167a9565b67ffffffffffffffff16111561248c576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861249986866167e8565b67ffffffffffffffff1611156124db576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124e9868686868686614bd6565b6124f2846155cd565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361263357607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f908152607560205260409020839055607954161561259357607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612618575f80fd5b505af115801561262a573d5f803e3d5ffd5b50505050612701565b61263b6157a7565b6079805467ffffffffffffffff16905f61265483616809565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c78565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612790576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118dd565b61281c614b55565b6128255f615852565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461298c575f61284f6138a0565b90508067ffffffffffffffff168267ffffffffffffffff161161289e576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806128e3575067ffffffffffffffff8083165f9081526072602052604090206001015416155b1561291a576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916129489162093a8091166167a9565b67ffffffffffffffff16111561298a576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6121196158c8565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146129e5576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b612a68614b55565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612b2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5391906166d4565b90505f612b5e6138a0565b60735467ffffffffffffffff680100000000000000008204811691612bb691700100000000000000000000000000000000820481169178010000000000000000000000000000000000000000000000009004166167e8565b612bc091906167a9565b612bca91906167e8565b67ffffffffffffffff169050805f03612be5575f9250505090565b612bef818361682f565b9250505090565b606f5460ff1615612c33576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c4287878787878787614f91565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612c9d6158c8565b50505050505050565b612cae614b55565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612d46576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612d8d576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16612df45760795467ffffffffffffffff700100000000000000000000000000000000909104811690821610612df4576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118dd565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612ec2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612f09576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118dd565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fc8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118dd565b613043614b55565b612119816155cd565b5f67ffffffff0000000167ffffffffffffffff8316108015613083575067ffffffff00000001604083901c67ffffffffffffffff16105b80156130a4575067ffffffff00000001608083901c67ffffffffffffffff16105b80156130bb575067ffffffff0000000160c083901c105b156130c857506001919050565b505f919050565b919050565b606f5460ff1615613111576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314613171576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036131ac576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156131e8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561324d575f80fd5b505af115801561325f573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132f191906166d4565b60735467ffffffffffffffff68010000000000000000820481165f818152607260205260408120549495504294919370010000000000000000000000000000000090049092169182905b87811015613647575f8b8b8381811061335657613356616842565b9050602002810190613368919061686f565b613371906168a1565b8051805160209091012060408201519192509067ffffffffffffffff1615613562578561339d81616809565b9650505f81836020015184604001516040516020016133f493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526071909352912054909150811461347c576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015181519384018a905290830185905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120955060715f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550613632565b8151516201d4c010156135a1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018b905260c08a901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c820152609d016040516020818303038152906040528051906020012094505b5050808061363f9061691a565b91505061333b565b5061365287856167a9565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156136bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060810182528381524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528b86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217948416830294909417905582547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1693029290921790558790828116908516146137ed5761378f82856167e8565b6137a39067ffffffffffffffff1682616951565b607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff88160217905590505b61383f33308360705461380091906167d1565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061594b565b6138476157a7565b60405167ffffffffffffffff8616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a25050505050505050505050565b613890614b55565b607761389c82826169b1565b5050565b6079545f9067ffffffffffffffff16156138e2575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613944576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661395082826169b1565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118dd919061602e565b5f54610100900460ff161580801561399e57505f54600160ff909116105b806139b75750303b1580156139b757505f5460ff166001145b613a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610da5565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613a9f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613aac602088018861627a565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b01604088016020890161627a565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613b66608088016060890161627a565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613bf086826169b1565b506077613bfd85826169b1565b5062093a80613c126060890160408a0161623e565b67ffffffffffffffff161115613c54576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c64606088016040890161623e565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613cc660a0890160808a0161623e565b67ffffffffffffffff161115613d08576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d1860a088016080890161623e565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613df7615a2d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e4c9493929190616b10565b60405180910390a18015612c9d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f1b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f58576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613f93576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613fcf576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161401a918491700100000000000000000000000000000000900416616b47565b1115614052576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614321575f8787838181106140b0576140b0616842565b90506020028101906140c2919061686f565b6140cb906168a1565b9050836140d781616809565b825180516020918201208185015160408087015190519499509194505f936141389386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556141e4600189616951565b84036142535742607b60149054906101000a900467ffffffffffffffff16846040015161421191906167a9565b67ffffffffffffffff161115614253576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083810151604080860151815193840189905290830185905260608084019290925260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120945050505080806143199061691a565b915050614095565b5061432c84846167a9565b6040805160608101825283815267ffffffffffffffff428116602080840191825260738054680100000000000000009081900485168688019081528589165f8181526072909552888520975188559451600190970180549151871683027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921697871697909717179095558054938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958402959095167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9094169390931793909317909155915192955090917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144ab576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614510575f80fd5b505af1158015614522573d5f803e3d5ffd5b50505050612825615acc565b614536614b55565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561461a576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614657576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6146606123ac565b90508181111561469c576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156146d8576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61471a73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461594b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015614784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147a891906166d4565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186147e283616809565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614819929190616b5a565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614947576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149a6565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161499d9493929190616b69565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146149fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118dd565b614a87614b55565b73ffffffffffffffffffffffffffffffffffffffff8116614b2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610da5565b61211981615852565b614b3b614b55565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610da5565b5f80614be06138a0565b905067ffffffffffffffff881615614caf5760795467ffffffffffffffff9081169089161115614c3c576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ca9576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d4f565b67ffffffffffffffff87165f90815260756020526040902054915081614d01576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d4f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614d9c576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614daa88888886896118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614dde91906166b9565b602060405180830381855afa158015614df9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e1c91906166d4565b614e269190616718565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ea891899190600401616b9e565b602060405180830381865afa158015614ec3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ee79190616bd8565b614f1d576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f8533614f2b858b6167e8565b67ffffffffffffffff16614f3d612aa3565b614f4791906167d1565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b5a565b50505050505050505050565b5f67ffffffffffffffff88161561505d5760795467ffffffffffffffff9081169089161115614fec576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615057576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506150f8565b5067ffffffffffffffff85165f90815260756020526040902054806150ae576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156150f8576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061512a57508767ffffffffffffffff168767ffffffffffffffff1611155b80615151575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615188576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146151ea576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6151f887878785886118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161522c91906166b9565b602060405180830381855afa158015615247573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061526a91906166d4565b6152749190616718565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916152f691889190600401616b9e565b602060405180830381865afa158015615311573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906153359190616bd8565b61536b576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614f85576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806153fa575060795467ffffffffffffffff908116908216115b15615431576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561555f575f80fd5b505af1158015615571573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155c091815260200190565b60405180910390a3505050565b5f6155d66138a0565b9050815f806155e584846167e8565b606f5467ffffffffffffffff91821692505f916156089161010090041642616951565b90505b8467ffffffffffffffff168467ffffffffffffffff16146156925767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561567057600181015468010000000000000000900467ffffffffffffffff16945061568c565b61567a86866167e8565b67ffffffffffffffff16935050615692565b5061560b565b5f61569d8484616951565b9050838110156156f457808403600c81116156b857806156bb565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816156ea576156ea6166eb565b0460705550615763565b838103600c81116157055780615708565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161573e5761573e6166eb565b04905080607054670de0b6b3a7640000028161575c5761575c6166eb565b0460705550505b683635c9adc5dea00000607054111561578857683635c9adc5dea00000607055612c9d565b633b9aca006070541015612c9d57633b9aca0060705550505050505050565b60795467ffffffffffffffff680100000000000000008204811691161115612825576079545f906157ef9068010000000000000000900467ffffffffffffffff1660016167a9565b90506157fa81611e90565b15612119576079545f9060029061581c90849067ffffffffffffffff166167e8565b6158269190616bf3565b61583090836167a9565b905061583b81611e90565b156158495761389c816153c0565b61389c826153c0565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561592d575f80fd5b505af115801561593f573d5f803e3d5ffd5b50505050612825615bb5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052615a279085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615c47565b50505050565b5f54610100900460ff16615ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610da5565b61282533615852565b606f5460ff16615b08576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bb09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016159a5565b505050565b606f5460ff1615615bf2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f615ca8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d529092919063ffffffff16565b805190915015615bb05780806020019051810190615cc69190616bd8565b615bb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610da5565b6060615d6084845f85615d68565b949350505050565b606082471015615dfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610da5565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e2291906166b9565b5f6040518083038185875af1925050503d805f8114615e5c576040519150601f19603f3d011682016040523d82523d5f602084013e615e61565b606091505b5091509150615e7287838387615e7d565b979650505050505050565b60608315615f125782515f03615f0b5773ffffffffffffffffffffffffffffffffffffffff85163b615f0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610da5565b5081615d60565b615d608383815115615f275781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5919061602e565b803567ffffffffffffffff811681146130cf575f80fd5b5f805f805f60a08688031215615f86575f80fd5b615f8f86615f5b565b9450615f9d60208701615f5b565b9350615fab60408701615f5b565b94979396509394606081013594506080013592915050565b5f5b83811015615fdd578181015183820152602001615fc5565b50505f910152565b5f8151808452615ffc816020860160208601615fc3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6160406020830184615fe5565b9392505050565b8060408101831015616057575f80fd5b92915050565b5f805f805f805f806101a0898b031215616075575f80fd5b61607e89615f5b565b975061608c60208a01615f5b565b965061609a60408a01615f5b565b955060608901359450608089013593506160b78a60a08b01616047565b925061016089018a8111156160ca575f80fd5b60e08a0192506160da8b82616047565b9150509295985092959890939650565b5f602082840312156160fa575f80fd5b813561ffff81168114616040575f80fd5b5f805f805f60a0868803121561611f575f80fd5b61612886615f5b565b945061613660208701615f5b565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616057575f80fd5b5f805f805f806103a0878903121561617b575f80fd5b61618487615f5b565b955061619260208801615f5b565b94506161a060408801615f5b565b935060608701359250608087013591506161bd8860a08901616154565b90509295509295509295565b5f805f805f805f6103c0888a0312156161e0575f80fd5b6161e988615f5b565b96506161f760208901615f5b565b955061620560408901615f5b565b945061621360608901615f5b565b93506080880135925060a088013591506162308960c08a01616154565b905092959891949750929550565b5f6020828403121561624e575f80fd5b61604082615f5b565b803573ffffffffffffffffffffffffffffffffffffffff811681146130cf575f80fd5b5f6020828403121561628a575f80fd5b61604082616257565b5f602082840312156162a3575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162e6575f80fd5b813567ffffffffffffffff80821115616301576163016162aa565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715616347576163476162aa565b8160405283815286602085880101111561635f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b8015158114612119575f80fd5b5f805f805f8060c087890312156163a0575f80fd5b86359550602087013567ffffffffffffffff8111156163bd575f80fd5b6163c989828a016162d7565b955050604087013593506163df60608801615f5b565b92506163ed60808801616257565b915060a08701356163fd8161637e565b809150509295509295509295565b5f8083601f84011261641b575f80fd5b50813567ffffffffffffffff811115616432575f80fd5b6020830191508360208260051b850101111561644c575f80fd5b9250929050565b5f805f60408486031215616465575f80fd5b833567ffffffffffffffff81111561647b575f80fd5b6164878682870161640b565b909450925061649a905060208501616257565b90509250925092565b5f602082840312156164b3575f80fd5b813567ffffffffffffffff8111156164c9575f80fd5b615d60848285016162d7565b5f8083601f8401126164e5575f80fd5b50813567ffffffffffffffff8111156164fc575f80fd5b60208301915083602082850101111561644c575f80fd5b5f805f805f8086880361012081121561652a575f80fd5b60a0811215616537575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561655c575f80fd5b6165688a838b016162d7565b955060e089013591508082111561657d575f80fd5b6165898a838b016162d7565b945061010089013591508082111561659f575f80fd5b506165ac89828a016164d5565b979a9699509497509295939492505050565b5f80602083850312156165cf575f80fd5b823567ffffffffffffffff8111156165e5575f80fd5b6165f18582860161640b565b90969095509350505050565b5f805f8060808587031215616610575f80fd5b61661985615f5b565b93506020850135925061662e60408601615f5b565b915061663c60608601615f5b565b905092959194509250565b5f805f60408486031215616659575f80fd5b833567ffffffffffffffff81111561666f575f80fd5b61667b868287016164d5565b909790965060209590950135949350505050565b5f80604083850312156166a0575f80fd5b823591506166b060208401615f5b565b90509250929050565b5f82516166ca818460208701615fc3565b9190910192915050565b5f602082840312156166e4575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82616726576167266166eb565b500690565b600181811c9082168061673f57607f821691505b602082108103616776577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167ca576167ca61677c565b5092915050565b80820281158282048414176160575761605761677c565b67ffffffffffffffff8281168282160390808211156167ca576167ca61677c565b5f67ffffffffffffffff8083168181036168255761682561677c565b6001019392505050565b5f8261683d5761683d6166eb565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166ca575f80fd5b5f606082360312156168b1575f80fd5b6040516060810167ffffffffffffffff82821081831117156168d5576168d56162aa565b8160405284359150808211156168e9575f80fd5b506168f6368286016162d7565b8252506020830135602082015261690f60408401615f5b565b604082015292915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361694a5761694a61677c565b5060010190565b818103818111156160575761605761677c565b601f821115615bb0575f81815260208120601f850160051c8101602086101561698a5750805b601f850160051c820191505b818110156169a957828155600101616996565b505050505050565b815167ffffffffffffffff8111156169cb576169cb6162aa565b6169df816169d9845461672b565b84616964565b602080601f831160018114616a31575f84156169fb5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169a9565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616a7d57888601518255948401946001909101908401616a5e565b5085821015616ab957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b3d606083018486616ac9565b9695505050505050565b808201808211156160575761605761677c565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b3d606083018486616ac9565b6103208101610300808584378201835f5b6001811015616bce578151835260209283019290910190600101616baf565b5050509392505050565b5f60208284031215616be8575f80fd5b81516160408161637e565b5f67ffffffffffffffff80841680616c0d57616c0d6166eb565b9216919091049291505056fea264697066735822122030d7e5b8e946812a9ca8fbe3f42e166f37589c6e0b9c47a75570b8bd2e1c9a8d64736f6c63430008140033", + "bytecode": "0x61014060405234801562000011575f80fd5b5060405162006f2038038062006f208339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051616d29620001f75f395f818161081501528181611a560152613e5601525f81816109a70152611a2c01525f818161096d015281816129e3015281816144e701526159e601525f8181610b380152818161170c01528181611bc801528181611d93015281816125f001528181612db101528181614757015261554301525f8181610bf801528181614eac01526152fa01525f8181610a75015281816129b1015281816132d90152818161472c0152614f980152616d295ff3fe608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea26469706673582212203d78dd0bda59d6322d20458734dd51eab51ad00e93348cf59380a0e5731cf93a64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea26469706673582212203d78dd0bda59d6322d20458734dd51eab51ad00e93348cf59380a0e5731cf93a64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMTimelock.json b/compiled-contracts/PolygonZkEVMTimelock.json index 1ae918d75..701df5c31 100644 --- a/compiled-contracts/PolygonZkEVMTimelock.json +++ b/compiled-contracts/PolygonZkEVMTimelock.json @@ -892,8 +892,8 @@ "type": "receive" } ], - "bytecode": "0x60a060405234801562000010575f80fd5b5060405162002c4d38038062002c4d833981016040819052620000339162000412565b84848484620000515f8051602062002bcd8339815191528062000232565b620000795f8051602062002bed8339815191525f8051602062002bcd83398151915262000232565b620000a15f8051602062002c0d8339815191525f8051602062002bcd83398151915262000232565b620000c95f8051602062002c2d8339815191525f8051602062002bcd83398151915262000232565b620000e35f8051602062002bcd833981519152306200027c565b6001600160a01b038116156200010d576200010d5f8051602062002bcd833981519152826200027c565b5f5b83518110156200019057620001555f8051602062002bed833981519152858381518110620001415762000141620004ad565b60200260200101516200027c60201b60201c565b6200017d5f8051602062002c2d833981519152858381518110620001415762000141620004ad565b6200018881620004c1565b90506200010f565b505f5b8251811015620001d857620001c55f8051602062002c0d833981519152848381518110620001415762000141620004ad565b620001d081620004c1565b905062000193565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b031660805250620004e692505050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200028882826200028c565b5050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1662000288575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b038116811462000353575f80fd5b50565b805162000363816200033e565b919050565b5f82601f83011262000378575f80fd5b815160206001600160401b03808311156200039757620003976200032a565b8260051b604051601f19603f83011681018181108482111715620003bf57620003bf6200032a565b604052938452858101830193838101925087851115620003dd575f80fd5b83870191505b848210156200040757620003f78262000356565b83529183019190830190620003e3565b979650505050505050565b5f805f805f60a0868803121562000427575f80fd5b855160208701519095506001600160401b038082111562000446575f80fd5b6200045489838a0162000368565b955060408801519150808211156200046a575f80fd5b50620004798882890162000368565b93505060608601516200048c816200033e565b60808701519092506200049f816200033e565b809150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620004df57634e487b7160e01b5f52601160045260245ffd5b5060010190565b6080516126c06200050d5f395f818161040201528181611124015261116401526126c05ff3fe6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220a51e9c8ab40666965f2c6a426c31d35eef4ebd6fb765348033b8ae6b30f36d1664736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", - "deployedBytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220a51e9c8ab40666965f2c6a426c31d35eef4ebd6fb765348033b8ae6b30f36d1664736f6c63430008140033", + "bytecode": "0x60a060405234801562000010575f80fd5b5060405162002c4d38038062002c4d833981016040819052620000339162000412565b84848484620000515f8051602062002bcd8339815191528062000232565b620000795f8051602062002bed8339815191525f8051602062002bcd83398151915262000232565b620000a15f8051602062002c0d8339815191525f8051602062002bcd83398151915262000232565b620000c95f8051602062002c2d8339815191525f8051602062002bcd83398151915262000232565b620000e35f8051602062002bcd833981519152306200027c565b6001600160a01b038116156200010d576200010d5f8051602062002bcd833981519152826200027c565b5f5b83518110156200019057620001555f8051602062002bed833981519152858381518110620001415762000141620004ad565b60200260200101516200027c60201b60201c565b6200017d5f8051602062002c2d833981519152858381518110620001415762000141620004ad565b6200018881620004c1565b90506200010f565b505f5b8251811015620001d857620001c55f8051602062002c0d833981519152848381518110620001415762000141620004ad565b620001d081620004c1565b905062000193565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b031660805250620004e692505050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200028882826200028c565b5050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1662000288575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b038116811462000353575f80fd5b50565b805162000363816200033e565b919050565b5f82601f83011262000378575f80fd5b815160206001600160401b03808311156200039757620003976200032a565b8260051b604051601f19603f83011681018181108482111715620003bf57620003bf6200032a565b604052938452858101830193838101925087851115620003dd575f80fd5b83870191505b848210156200040757620003f78262000356565b83529183019190830190620003e3565b979650505050505050565b5f805f805f60a0868803121562000427575f80fd5b855160208701519095506001600160401b038082111562000446575f80fd5b6200045489838a0162000368565b955060408801519150808211156200046a575f80fd5b50620004798882890162000368565b93505060608601516200048c816200033e565b60808701519092506200049f816200033e565b809150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620004df57634e487b7160e01b5f52601160045260245ffd5b5060010190565b6080516126c06200050d5f395f818161040201528181611124015261116401526126c05ff3fe6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "deployedBytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMV2.json b/compiled-contracts/PolygonZkEVMV2.json new file mode 100644 index 000000000..e82c6c44a --- /dev/null +++ b/compiled-contracts/PolygonZkEVMV2.json @@ -0,0 +1,1008 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMV2", + "sourceName": "contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "_bridgeAddress", + "type": "address" + }, + { + "internalType": "contract PolygonRollupManager", + "name": "_rollupManager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "BatchAlreadyVerified", + "type": "error" + }, + { + "inputs": [], + "name": "BatchNotSequencedOrNotSequenceEnd", + "type": "error" + }, + { + "inputs": [], + "name": "ExceedMaxVerifyBatches", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchBelowLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "FinalPendingStateNumInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesAlreadyActive", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "ForcedDataDoesNotMatch", + "type": "error" + }, + { + "inputs": [], + "name": "GasTokenNetworkMustBeZeroOnEther", + "type": "error" + }, + { + "inputs": [], + "name": "GlobalExitRootNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "HaltTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "InitNumBatchAboveLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "InitNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitializeTransaction", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeBatchTimeTarget", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeForceBatchTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeMultiplierBatchFee", + "type": "error" + }, + { + "inputs": [], + "name": "NewAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "NewPendingStateTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NewStateRootNotInsidePrime", + "type": "error" + }, + { + "inputs": [], + "name": "NewTrustedAggregatorTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughMaticAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughPOLAmount", + "type": "error" + }, + { + "inputs": [], + "name": "OldAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OldStateRootDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyPendingAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyRollupManager", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyTrustedAggregator", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyTrustedSequencer", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateNotConsolidable", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateTimeoutExceedHaltAggregationTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "SequenceZeroBatches", + "type": "error" + }, + { + "inputs": [], + "name": "SequencedTimestampBelowForcedTimestamp", + "type": "error" + }, + { + "inputs": [], + "name": "SequencedTimestampInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "StoredRootMustBeDifferentThanNewRoot", + "type": "error" + }, + { + "inputs": [], + "name": "TransactionsLengthAboveMax", + "type": "error" + }, + { + "inputs": [], + "name": "TrustedAggregatorTimeoutExceedHaltAggregationTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "TrustedAggregatorTimeoutNotExpired", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AcceptAdminRole", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "ActivateForceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "forceBatchNum", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + } + ], + "name": "ForceBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + } + ], + "name": "SequenceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + } + ], + "name": "SequenceForceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "newforceBatchTimeout", + "type": "uint64" + } + ], + "name": "SetForceBatchTimeout", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newTrustedSequencer", + "type": "address" + } + ], + "name": "SetTrustedSequencer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "newTrustedSequencerURL", + "type": "string" + } + ], + "name": "SetTrustedSequencerURL", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "TransferAdminRole", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "VerifyBatches", + "type": "event" + }, + { + "inputs": [], + "name": "BASE_INITIALIZE_TX_BRIDGE", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", + "outputs": [ + { + "internalType": "bytes1", + "name": "", + "type": "bytes1" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SIGNATURE_INITIALIZE_TX_R", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SIGNATURE_INITIALIZE_TX_S", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SIGNATURE_INITIALIZE_TX_V", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptAdminRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "activateForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "calculatePolPerForceBatch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "polAmount", + "type": "uint256" + } + ], + "name": "forceBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "forceBatchTimeout", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "name": "forcedBatches", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenNetwork", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "networkID", + "type": "uint32" + }, + { + "internalType": "address", + "name": "_gasTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_gasTokenNetwork", + "type": "uint32" + } + ], + "name": "generateInitializeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "address", + "name": "sequencer", + "type": "address" + }, + { + "internalType": "uint32", + "name": "networkID", + "type": "uint32" + }, + { + "internalType": "address", + "name": "_gasTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_gasTokenNetwork", + "type": "uint32" + }, + { + "internalType": "string", + "name": "sequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "_networkName", + "type": "string" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isForcedBatchAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastAccInputHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastForceBatch", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastForceBatchSequenced", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "networkName", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "lastVerifiedBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "newStateRoot", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "onVerifyBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pol", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rollupManager", + "outputs": [ + { + "internalType": "contract PolygonRollupManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "globalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "minForcedTimestamp", + "type": "uint64" + } + ], + "internalType": "struct PolygonRollupBase.BatchData[]", + "name": "batches", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "l2Coinbase", + "type": "address" + } + ], + "name": "sequenceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "globalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "minForcedTimestamp", + "type": "uint64" + } + ], + "internalType": "struct PolygonRollupBase.ForcedBatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newforceBatchTimeout", + "type": "uint64" + } + ], + "name": "setForceBatchTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newTrustedSequencer", + "type": "address" + } + ], + "name": "setTrustedSequencer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "newTrustedSequencerURL", + "type": "string" + } + ], + "name": "setTrustedSequencerURL", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "transferAdminRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "trustedSequencer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "trustedSequencerURL", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x61010060405234801562000011575f80fd5b5060405162003a0a38038062003a0a83398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051613884620001865f395f818161043b0152818161083b0152818161090a01528181610d8501528181610f4b015281816116960152818161175f0152818161178101528181611910015281816123fb015281816124c801526125b001525f8181610509015261185701525f81816105b2015281816113bd01526126f801525f81816105ff015281816106da015281816116e90152818161182d01526126cd01526138845ff3fe608060405234801561000f575f80fd5b5060043610610268575f3560e01c80636ff512cc11610157578063cfa8ed47116100d2578063e46761c411610088578063eaeb077b1161006e578063eaeb077b14610641578063f35dda4714610654578063f851a4401461066e575f80fd5b8063e46761c4146105fa578063e7a7ed0214610621575f80fd5b8063d690be31116100b8578063d690be31146105d4578063d7bc90ff146105dc578063d8d1091b146105e7575f80fd5b8063cfa8ed471461058d578063d02103ca146105ad575f80fd5b8063a3c573eb11610127578063b0afe1541161010d578063b0afe1541461053e578063c754c7ed1461054a578063c89e42df1461057a575f80fd5b8063a3c573eb14610504578063ada8f9191461052b575f80fd5b80636ff512cc146104bb5780638c3d7301146104ce57806399af0397146104d65780639e001877146104e9575f80fd5b806345605267116101e7578063542028d5116101b75780635ec919581161019d5780635ec919581461048b5780636b8616ce146104935780636e05d2cd146104b2575f80fd5b8063542028d5146104705780635e9145c914610478575f80fd5b806345605267146103fb57806347ebf1081461042357806349b7b802146104365780634e4877061461045d575f80fd5b80632b35b3ac1161023c5780633c351e10116102225780633c351e10146103405780633cbc795b1461036557806340b5de6c146103a3575f80fd5b80632b35b3ac1461030e57806332c2d1531461032b575f80fd5b8062d0295d1461026c578063107bf28c1461028757806319d8ac611461029c57806326782247146102c9575b5f80fd5b610274610693565b6040519081526020015b60405180910390f35b61028f6107ad565b60405161027e9190612e14565b6007546102b09067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161027e565b6001546102e99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161027e565b60085461031b9060ff1681565b604051901515815260200161027e565b61033e610339366004612e6d565b610839565b005b6008546102e990610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461038e907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161027e565b6103ca7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161027e565b6007546102b090700100000000000000000000000000000000900467ffffffffffffffff1681565b61033e610431366004612f8f565b610908565b6102e97f000000000000000000000000000000000000000000000000000000000000000081565b61033e61046b36600461303f565b610eac565b61028f6110c3565b61033e6104863660046130a2565b6110d0565b61033e6119d3565b6102746104a136600461303f565b60066020525f908152604090205481565b61027460055481565b61033e6104c93660046130e9565b611abb565b61033e611b84565b61028f6104e4366004613102565b611c56565b6102e973a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102e97f000000000000000000000000000000000000000000000000000000000000000081565b61033e6105393660046130e9565b611ece565b6102746405ca1ab1e081565b6007546102b0907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61033e610588366004613139565b611f97565b6002546102e99073ffffffffffffffffffffffffffffffffffffffff1681565b6102e97f000000000000000000000000000000000000000000000000000000000000000081565b61028f612029565b610274635ca1ab1e81565b61033e6105f536600461316b565b612045565b6102e97f000000000000000000000000000000000000000000000000000000000000000081565b6007546102b09068010000000000000000900467ffffffffffffffff1681565b61033e61064f3660046131aa565b612571565b61065c601b81565b60405160ff909116815260200161027e565b5f546102e99062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561071f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610743919061321b565b6007549091505f906107819067ffffffffffffffff70010000000000000000000000000000000082048116916801000000000000000090041661325f565b67ffffffffffffffff169050805f0361079c575f9250505090565b6107a68183613287565b9250505090565b600480546107ba906132bf565b80601f01602080910402602001604051908101604052809291908181526020018280546107e6906132bf565b80156108315780601f1061080857610100808354040283529160200191610831565b820191905f5260205f20905b81548152906001019060200180831161081457829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146108a8576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516108fb91815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610977576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561099557505f54600160ff909116105b806109ae5750303b1580156109ae57505f5460ff166001145b610a3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a9b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610b22848261335d565b506004610b2f838261335d565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610bc65763ffffffff841615610bc6576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790555f610c58878787611c56565b8051602080830191909120604080515f93810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015610de0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e049190613475565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a250505050508015610ea2575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f02576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610f49576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd69190613490565b61103f5760075467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061103f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546107ba906132bf565b60025473ffffffffffffffffffffffffffffffffffffffff163314611121576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361115c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611198576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff8083169270010000000000000000000000000000000090041690815f5b858110156115cc575f8989838181106111df576111df6134af565b90506020028101906111f191906134dc565b6111fa90613518565b8051805160209091012060608201519192509067ffffffffffffffff161561137a5785611226816135a6565b9650505f818360200151846060015160405160200161127d93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114611305576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff16101561135b576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86165f908152600660205260408120556114b4565b60208201511580159061143e575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af1158015611418573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061143c919061321b565b155b15611475576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156114b4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806114e7575042826040015167ffffffffffffffff16115b1561151e576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806115c4906135cc565b9150506111c4565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611623576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff868116919091179091556005839055859082811690851614611759575f611679838661325f565b905061168f67ffffffffffffffff821683613603565b91506117107f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166116c8610693565b6116d2919061361c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612958565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611855337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180c919061321b565b611816919061361c565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612a31565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156118ba575f80fd5b505af11580156118cc573d5f803e3d5ffd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff89166004820152602481018690525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303815f875af115801561196c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119909190613475565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a250505050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a29576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611a66576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016110b8565b60015473ffffffffffffffffffffffffffffffffffffffff163314611bd5576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60605f60405180606001604052806021815260200161382e6021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe000000000000000000000000000000000000000000000000000000001790529051611d4d93929101613633565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611dd8573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611e50576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90611e959084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613661565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f24576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016110b8565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611fed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003611ff9828261335d565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516110b89190612e14565b60405180606001604052806021815260200161382e6021913981565b60085460ff16612081576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f8190036120bc576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156120f8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916121339184917001000000000000000000000000000000009004166136bc565b111561216b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff16905f5b838110156123f5575f8686838181106121ae576121ae6134af565b90506020028101906121c091906136cf565b6121c990613701565b9050836121d5816135a6565b825180516020918201208185015160408087015190519499509194505f936122369386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146122be576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152600660205260408120556122e2600188613603565b84036123515742600760189054906101000a900467ffffffffffffffff16846040015161230f919061377c565b67ffffffffffffffff161115612351576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806123ed906135cc565b915050612193565b506124237f0000000000000000000000000000000000000000000000000000000000000000846116c8610693565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e730000000000000000000000000000000000000000000000000000000081529084166004820152602481018290525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303815f875af115801561250e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125329190613475565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff166125ad576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612617573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061263b919061321b565b905081811115612677576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156126b3576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126f573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612a31565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561275f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612783919061321b565b600780549192506801000000000000000090910467ffffffffffffffff169060086127ad836135a6565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505084846040516127e492919061379d565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff165f90815260069093529120553233036128f2576007546040805183815233602082015260609181018290525f918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612951565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161294894939291906137ac565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612a2c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a95565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612a8f9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016129aa565b50505050565b5f612af6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ba09092919063ffffffff16565b805190915015612a2c5780806020019051810190612b149190613490565b612a2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a36565b6060612bae84845f85612bb6565b949350505050565b606082471015612c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a36565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051612c70919061381c565b5f6040518083038185875af1925050503d805f8114612caa576040519150601f19603f3d011682016040523d82523d5f602084013e612caf565b606091505b5091509150612cc087838387612ccb565b979650505050505050565b60608315612d605782515f03612d595773ffffffffffffffffffffffffffffffffffffffff85163b612d59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a36565b5081612bae565b612bae8383815115612d755781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a369190612e14565b5f5b83811015612dc3578181015183820152602001612dab565b50505f910152565b5f8151808452612de2816020860160208601612da9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f612e266020830184612dcb565b9392505050565b67ffffffffffffffff81168114612e42575f80fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff81168114612e68575f80fd5b919050565b5f805f60608486031215612e7f575f80fd5b8335612e8a81612e2d565b925060208401359150612e9f60408501612e45565b90509250925092565b803563ffffffff81168114612e68575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612ef7575f80fd5b813567ffffffffffffffff80821115612f1257612f12612ebb565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612f5857612f58612ebb565b81604052838152866020858801011115612f70575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215612fa5575f80fd5b612fae88612e45565b9650612fbc60208901612e45565b9550612fca60408901612ea8565b9450612fd860608901612e45565b9350612fe660808901612ea8565b925060a088013567ffffffffffffffff80821115613002575f80fd5b61300e8b838c01612ee8565b935060c08a0135915080821115613023575f80fd5b506130308a828b01612ee8565b91505092959891949750929550565b5f6020828403121561304f575f80fd5b8135612e2681612e2d565b5f8083601f84011261306a575f80fd5b50813567ffffffffffffffff811115613081575f80fd5b6020830191508360208260051b850101111561309b575f80fd5b9250929050565b5f805f604084860312156130b4575f80fd5b833567ffffffffffffffff8111156130ca575f80fd5b6130d68682870161305a565b9094509250612e9f905060208501612e45565b5f602082840312156130f9575f80fd5b612e2682612e45565b5f805f60608486031215613114575f80fd5b61311d84612ea8565b925061312b60208501612e45565b9150612e9f60408501612ea8565b5f60208284031215613149575f80fd5b813567ffffffffffffffff81111561315f575f80fd5b612bae84828501612ee8565b5f806020838503121561317c575f80fd5b823567ffffffffffffffff811115613192575f80fd5b61319e8582860161305a565b90969095509350505050565b5f805f604084860312156131bc575f80fd5b833567ffffffffffffffff808211156131d3575f80fd5b818601915086601f8301126131e6575f80fd5b8135818111156131f4575f80fd5b876020828501011115613205575f80fd5b6020928301989097509590910135949350505050565b5f6020828403121561322b575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561328057613280613232565b5092915050565b5f826132ba577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806132d357607f821691505b60208210810361330a577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115612a2c575f81815260208120601f850160051c810160208610156133365750805b601f850160051c820191505b8181101561335557828155600101613342565b505050505050565b815167ffffffffffffffff81111561337757613377612ebb565b61338b8161338584546132bf565b84613310565b602080601f8311600181146133dd575f84156133a75750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613355565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156134295788860151825594840194600190910190840161340a565b508582101561346557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215613485575f80fd5b8151612e2681612e2d565b5f602082840312156134a0575f80fd5b81518015158114612e26575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261350e575f80fd5b9190910192915050565b5f60808236031215613528575f80fd5b6040516080810167ffffffffffffffff828210818311171561354c5761354c612ebb565b816040528435915080821115613560575f80fd5b5061356d36828601612ee8565b82525060208301356020820152604083013561358881612e2d565b6040820152606083013561359b81612e2d565b606082015292915050565b5f67ffffffffffffffff8083168181036135c2576135c2613232565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135fc576135fc613232565b5060010190565b8181038181111561361657613616613232565b92915050565b808202811582820484141761361657613616613232565b5f8351613644818460208801612da9565b835190830190613658818360208801612da9565b01949350505050565b5f8651613672818460208b01612da9565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8082018082111561361657613616613232565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261350e575f80fd5b5f60608236031215613711575f80fd5b6040516060810167ffffffffffffffff828210818311171561373557613735612ebb565b816040528435915080821115613749575f80fd5b5061375636828601612ee8565b82525060208301356020820152604083013561377181612e2d565b604082015292915050565b67ffffffffffffffff81811683821601908082111561328057613280613232565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f825161350e818460208701612da956fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212206feee19bf46ff5b42a73b786ea646b20cd5d9ff5ba7e94d84ced0fb953aee9df64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610268575f3560e01c80636ff512cc11610157578063cfa8ed47116100d2578063e46761c411610088578063eaeb077b1161006e578063eaeb077b14610641578063f35dda4714610654578063f851a4401461066e575f80fd5b8063e46761c4146105fa578063e7a7ed0214610621575f80fd5b8063d690be31116100b8578063d690be31146105d4578063d7bc90ff146105dc578063d8d1091b146105e7575f80fd5b8063cfa8ed471461058d578063d02103ca146105ad575f80fd5b8063a3c573eb11610127578063b0afe1541161010d578063b0afe1541461053e578063c754c7ed1461054a578063c89e42df1461057a575f80fd5b8063a3c573eb14610504578063ada8f9191461052b575f80fd5b80636ff512cc146104bb5780638c3d7301146104ce57806399af0397146104d65780639e001877146104e9575f80fd5b806345605267116101e7578063542028d5116101b75780635ec919581161019d5780635ec919581461048b5780636b8616ce146104935780636e05d2cd146104b2575f80fd5b8063542028d5146104705780635e9145c914610478575f80fd5b806345605267146103fb57806347ebf1081461042357806349b7b802146104365780634e4877061461045d575f80fd5b80632b35b3ac1161023c5780633c351e10116102225780633c351e10146103405780633cbc795b1461036557806340b5de6c146103a3575f80fd5b80632b35b3ac1461030e57806332c2d1531461032b575f80fd5b8062d0295d1461026c578063107bf28c1461028757806319d8ac611461029c57806326782247146102c9575b5f80fd5b610274610693565b6040519081526020015b60405180910390f35b61028f6107ad565b60405161027e9190612e14565b6007546102b09067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161027e565b6001546102e99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161027e565b60085461031b9060ff1681565b604051901515815260200161027e565b61033e610339366004612e6d565b610839565b005b6008546102e990610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461038e907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161027e565b6103ca7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161027e565b6007546102b090700100000000000000000000000000000000900467ffffffffffffffff1681565b61033e610431366004612f8f565b610908565b6102e97f000000000000000000000000000000000000000000000000000000000000000081565b61033e61046b36600461303f565b610eac565b61028f6110c3565b61033e6104863660046130a2565b6110d0565b61033e6119d3565b6102746104a136600461303f565b60066020525f908152604090205481565b61027460055481565b61033e6104c93660046130e9565b611abb565b61033e611b84565b61028f6104e4366004613102565b611c56565b6102e973a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102e97f000000000000000000000000000000000000000000000000000000000000000081565b61033e6105393660046130e9565b611ece565b6102746405ca1ab1e081565b6007546102b0907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61033e610588366004613139565b611f97565b6002546102e99073ffffffffffffffffffffffffffffffffffffffff1681565b6102e97f000000000000000000000000000000000000000000000000000000000000000081565b61028f612029565b610274635ca1ab1e81565b61033e6105f536600461316b565b612045565b6102e97f000000000000000000000000000000000000000000000000000000000000000081565b6007546102b09068010000000000000000900467ffffffffffffffff1681565b61033e61064f3660046131aa565b612571565b61065c601b81565b60405160ff909116815260200161027e565b5f546102e99062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561071f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610743919061321b565b6007549091505f906107819067ffffffffffffffff70010000000000000000000000000000000082048116916801000000000000000090041661325f565b67ffffffffffffffff169050805f0361079c575f9250505090565b6107a68183613287565b9250505090565b600480546107ba906132bf565b80601f01602080910402602001604051908101604052809291908181526020018280546107e6906132bf565b80156108315780601f1061080857610100808354040283529160200191610831565b820191905f5260205f20905b81548152906001019060200180831161081457829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146108a8576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516108fb91815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610977576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561099557505f54600160ff909116105b806109ae5750303b1580156109ae57505f5460ff166001145b610a3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a9b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610b22848261335d565b506004610b2f838261335d565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610bc65763ffffffff841615610bc6576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790555f610c58878787611c56565b8051602080830191909120604080515f93810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015610de0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e049190613475565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a250505050508015610ea2575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f02576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610f49576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd69190613490565b61103f5760075467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061103f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546107ba906132bf565b60025473ffffffffffffffffffffffffffffffffffffffff163314611121576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361115c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611198576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff8083169270010000000000000000000000000000000090041690815f5b858110156115cc575f8989838181106111df576111df6134af565b90506020028101906111f191906134dc565b6111fa90613518565b8051805160209091012060608201519192509067ffffffffffffffff161561137a5785611226816135a6565b9650505f818360200151846060015160405160200161127d93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114611305576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff16101561135b576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86165f908152600660205260408120556114b4565b60208201511580159061143e575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af1158015611418573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061143c919061321b565b155b15611475576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156114b4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806114e7575042826040015167ffffffffffffffff16115b1561151e576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806115c4906135cc565b9150506111c4565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611623576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff868116919091179091556005839055859082811690851614611759575f611679838661325f565b905061168f67ffffffffffffffff821683613603565b91506117107f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166116c8610693565b6116d2919061361c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612958565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611855337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180c919061321b565b611816919061361c565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612a31565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156118ba575f80fd5b505af11580156118cc573d5f803e3d5ffd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff89166004820152602481018690525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303815f875af115801561196c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119909190613475565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a250505050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a29576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611a66576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016110b8565b60015473ffffffffffffffffffffffffffffffffffffffff163314611bd5576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60605f60405180606001604052806021815260200161382e6021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe000000000000000000000000000000000000000000000000000000001790529051611d4d93929101613633565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611dd8573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611e50576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90611e959084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613661565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f24576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016110b8565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611fed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003611ff9828261335d565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516110b89190612e14565b60405180606001604052806021815260200161382e6021913981565b60085460ff16612081576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f8190036120bc576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156120f8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916121339184917001000000000000000000000000000000009004166136bc565b111561216b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff16905f5b838110156123f5575f8686838181106121ae576121ae6134af565b90506020028101906121c091906136cf565b6121c990613701565b9050836121d5816135a6565b825180516020918201208185015160408087015190519499509194505f936122369386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146122be576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152600660205260408120556122e2600188613603565b84036123515742600760189054906101000a900467ffffffffffffffff16846040015161230f919061377c565b67ffffffffffffffff161115612351576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806123ed906135cc565b915050612193565b506124237f0000000000000000000000000000000000000000000000000000000000000000846116c8610693565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e730000000000000000000000000000000000000000000000000000000081529084166004820152602481018290525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303815f875af115801561250e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125329190613475565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff166125ad576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612617573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061263b919061321b565b905081811115612677576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156126b3576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126f573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612a31565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561275f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612783919061321b565b600780549192506801000000000000000090910467ffffffffffffffff169060086127ad836135a6565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505084846040516127e492919061379d565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff165f90815260069093529120553233036128f2576007546040805183815233602082015260609181018290525f918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612951565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161294894939291906137ac565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612a2c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a95565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612a8f9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016129aa565b50505050565b5f612af6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ba09092919063ffffffff16565b805190915015612a2c5780806020019051810190612b149190613490565b612a2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a36565b6060612bae84845f85612bb6565b949350505050565b606082471015612c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a36565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051612c70919061381c565b5f6040518083038185875af1925050503d805f8114612caa576040519150601f19603f3d011682016040523d82523d5f602084013e612caf565b606091505b5091509150612cc087838387612ccb565b979650505050505050565b60608315612d605782515f03612d595773ffffffffffffffffffffffffffffffffffffffff85163b612d59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a36565b5081612bae565b612bae8383815115612d755781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a369190612e14565b5f5b83811015612dc3578181015183820152602001612dab565b50505f910152565b5f8151808452612de2816020860160208601612da9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f612e266020830184612dcb565b9392505050565b67ffffffffffffffff81168114612e42575f80fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff81168114612e68575f80fd5b919050565b5f805f60608486031215612e7f575f80fd5b8335612e8a81612e2d565b925060208401359150612e9f60408501612e45565b90509250925092565b803563ffffffff81168114612e68575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612ef7575f80fd5b813567ffffffffffffffff80821115612f1257612f12612ebb565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612f5857612f58612ebb565b81604052838152866020858801011115612f70575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215612fa5575f80fd5b612fae88612e45565b9650612fbc60208901612e45565b9550612fca60408901612ea8565b9450612fd860608901612e45565b9350612fe660808901612ea8565b925060a088013567ffffffffffffffff80821115613002575f80fd5b61300e8b838c01612ee8565b935060c08a0135915080821115613023575f80fd5b506130308a828b01612ee8565b91505092959891949750929550565b5f6020828403121561304f575f80fd5b8135612e2681612e2d565b5f8083601f84011261306a575f80fd5b50813567ffffffffffffffff811115613081575f80fd5b6020830191508360208260051b850101111561309b575f80fd5b9250929050565b5f805f604084860312156130b4575f80fd5b833567ffffffffffffffff8111156130ca575f80fd5b6130d68682870161305a565b9094509250612e9f905060208501612e45565b5f602082840312156130f9575f80fd5b612e2682612e45565b5f805f60608486031215613114575f80fd5b61311d84612ea8565b925061312b60208501612e45565b9150612e9f60408501612ea8565b5f60208284031215613149575f80fd5b813567ffffffffffffffff81111561315f575f80fd5b612bae84828501612ee8565b5f806020838503121561317c575f80fd5b823567ffffffffffffffff811115613192575f80fd5b61319e8582860161305a565b90969095509350505050565b5f805f604084860312156131bc575f80fd5b833567ffffffffffffffff808211156131d3575f80fd5b818601915086601f8301126131e6575f80fd5b8135818111156131f4575f80fd5b876020828501011115613205575f80fd5b6020928301989097509590910135949350505050565b5f6020828403121561322b575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561328057613280613232565b5092915050565b5f826132ba577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806132d357607f821691505b60208210810361330a577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115612a2c575f81815260208120601f850160051c810160208610156133365750805b601f850160051c820191505b8181101561335557828155600101613342565b505050505050565b815167ffffffffffffffff81111561337757613377612ebb565b61338b8161338584546132bf565b84613310565b602080601f8311600181146133dd575f84156133a75750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613355565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156134295788860151825594840194600190910190840161340a565b508582101561346557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215613485575f80fd5b8151612e2681612e2d565b5f602082840312156134a0575f80fd5b81518015158114612e26575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261350e575f80fd5b9190910192915050565b5f60808236031215613528575f80fd5b6040516080810167ffffffffffffffff828210818311171561354c5761354c612ebb565b816040528435915080821115613560575f80fd5b5061356d36828601612ee8565b82525060208301356020820152604083013561358881612e2d565b6040820152606083013561359b81612e2d565b606082015292915050565b5f67ffffffffffffffff8083168181036135c2576135c2613232565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135fc576135fc613232565b5060010190565b8181038181111561361657613616613232565b92915050565b808202811582820484141761361657613616613232565b5f8351613644818460208801612da9565b835190830190613658818360208801612da9565b01949350505050565b5f8651613672818460208b01612da9565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8082018082111561361657613616613232565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261350e575f80fd5b5f60608236031215613711575f80fd5b6040516060810167ffffffffffffffff828210818311171561373557613735612ebb565b816040528435915080821115613749575f80fd5b5061375636828601612ee8565b82525060208301356020820152604083013561377181612e2d565b604082015292915050565b67ffffffffffffffff81811683821601908082111561328057613280613232565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f825161350e818460208701612da956fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212206feee19bf46ff5b42a73b786ea646b20cd5d9ff5ba7e94d84ced0fb953aee9df64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/PolygonZkEVMV2Existent.json b/compiled-contracts/PolygonZkEVMV2Existent.json new file mode 100644 index 000000000..5459198ed --- /dev/null +++ b/compiled-contracts/PolygonZkEVMV2Existent.json @@ -0,0 +1,1046 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMV2Existent", + "sourceName": "contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "_bridgeAddress", + "type": "address" + }, + { + "internalType": "contract PolygonRollupManager", + "name": "_rollupManager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "BatchAlreadyVerified", + "type": "error" + }, + { + "inputs": [], + "name": "BatchNotSequencedOrNotSequenceEnd", + "type": "error" + }, + { + "inputs": [], + "name": "ExceedMaxVerifyBatches", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchBelowLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "FinalPendingStateNumInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesAlreadyActive", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "ForcedDataDoesNotMatch", + "type": "error" + }, + { + "inputs": [], + "name": "GasTokenNetworkMustBeZeroOnEther", + "type": "error" + }, + { + "inputs": [], + "name": "GlobalExitRootNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "HaltTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "InitNumBatchAboveLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "InitNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitializeTransaction", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeBatchTimeTarget", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeForceBatchTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeMultiplierBatchFee", + "type": "error" + }, + { + "inputs": [], + "name": "NewAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "NewPendingStateTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NewStateRootNotInsidePrime", + "type": "error" + }, + { + "inputs": [], + "name": "NewTrustedAggregatorTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughMaticAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughPOLAmount", + "type": "error" + }, + { + "inputs": [], + "name": "OldAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OldStateRootDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyPendingAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyRollupManager", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyTrustedAggregator", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyTrustedSequencer", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateNotConsolidable", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateTimeoutExceedHaltAggregationTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "SequenceZeroBatches", + "type": "error" + }, + { + "inputs": [], + "name": "SequencedTimestampBelowForcedTimestamp", + "type": "error" + }, + { + "inputs": [], + "name": "SequencedTimestampInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "StoredRootMustBeDifferentThanNewRoot", + "type": "error" + }, + { + "inputs": [], + "name": "TransactionsLengthAboveMax", + "type": "error" + }, + { + "inputs": [], + "name": "TrustedAggregatorTimeoutExceedHaltAggregationTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "TrustedAggregatorTimeoutNotExpired", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AcceptAdminRole", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "ActivateForceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "forceBatchNum", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + } + ], + "name": "ForceBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + } + ], + "name": "SequenceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + } + ], + "name": "SequenceForceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "newforceBatchTimeout", + "type": "uint64" + } + ], + "name": "SetForceBatchTimeout", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newTrustedSequencer", + "type": "address" + } + ], + "name": "SetTrustedSequencer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "newTrustedSequencerURL", + "type": "string" + } + ], + "name": "SetTrustedSequencerURL", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "TransferAdminRole", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "VerifyBatches", + "type": "event" + }, + { + "inputs": [], + "name": "BASE_INITIALIZE_TX_BRIDGE", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", + "outputs": [ + { + "internalType": "bytes1", + "name": "", + "type": "bytes1" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SIGNATURE_INITIALIZE_TX_R", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SIGNATURE_INITIALIZE_TX_S", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SIGNATURE_INITIALIZE_TX_V", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptAdminRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "activateForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "calculatePolPerForceBatch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "polAmount", + "type": "uint256" + } + ], + "name": "forceBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "forceBatchTimeout", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "name": "forcedBatches", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenNetwork", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "networkID", + "type": "uint32" + }, + { + "internalType": "address", + "name": "_gasTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_gasTokenNetwork", + "type": "uint32" + } + ], + "name": "generateInitializeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "address", + "name": "sequencer", + "type": "address" + }, + { + "internalType": "uint32", + "name": "networkID", + "type": "uint32" + }, + { + "internalType": "address", + "name": "_gasTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_gasTokenNetwork", + "type": "uint32" + }, + { + "internalType": "string", + "name": "sequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "_networkName", + "type": "string" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "address", + "name": "_trustedSequencer", + "type": "address" + }, + { + "internalType": "string", + "name": "_trustedSequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "_networkName", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "_lastAccInputHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "_lastTimestamp", + "type": "uint64" + } + ], + "name": "initializeUpgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isForcedBatchAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastAccInputHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastForceBatch", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastForceBatchSequenced", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "networkName", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "lastVerifiedBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "newStateRoot", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "onVerifyBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pol", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rollupManager", + "outputs": [ + { + "internalType": "contract PolygonRollupManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "globalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "minForcedTimestamp", + "type": "uint64" + } + ], + "internalType": "struct PolygonRollupBase.BatchData[]", + "name": "batches", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "l2Coinbase", + "type": "address" + } + ], + "name": "sequenceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "globalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "minForcedTimestamp", + "type": "uint64" + } + ], + "internalType": "struct PolygonRollupBase.ForcedBatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newforceBatchTimeout", + "type": "uint64" + } + ], + "name": "setForceBatchTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newTrustedSequencer", + "type": "address" + } + ], + "name": "setTrustedSequencer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "newTrustedSequencerURL", + "type": "string" + } + ], + "name": "setTrustedSequencerURL", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "transferAdminRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "trustedSequencer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "trustedSequencerURL", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x61010060405234801562000011575f80fd5b5060405162003db838038062003db883398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051613c2b6200018d5f395f8181610455015281816108680152818161093701528181610db201528181610f78015281816116c30152818161178c015281816117ae0152818161193d01528181611fc601528181612706015281816127d301526128bb01525f8181610523015261188401525f81816105df015281816113ea0152612a0301525f818161062c01528181610707015281816117160152818161185a01526129d80152613c2b5ff3fe608060405234801561000f575f80fd5b5060043610610282575f3560e01c80638c3d730111610157578063cfa8ed47116100d2578063e46761c411610088578063eaeb077b1161006e578063eaeb077b1461066e578063f35dda4714610681578063f851a4401461069b575f80fd5b8063e46761c414610627578063e7a7ed021461064e575f80fd5b8063d690be31116100b8578063d690be3114610601578063d7bc90ff14610609578063d8d1091b14610614575f80fd5b8063cfa8ed47146105ba578063d02103ca146105da575f80fd5b8063ada8f91911610127578063bb5907081161010d578063bb59070814610564578063c754c7ed14610577578063c89e42df146105a7575f80fd5b8063ada8f91914610545578063b0afe15414610558575f80fd5b80638c3d7301146104e857806399af0397146104f05780639e00187714610503578063a3c573eb1461051e575f80fd5b806345605267116102015780635e9145c9116101b75780636b8616ce1161019d5780636b8616ce146104ad5780636e05d2cd146104cc5780636ff512cc146104d5575f80fd5b80635e9145c9146104925780635ec91958146104a5575f80fd5b806349b7b802116101e757806349b7b802146104505780634e48770614610477578063542028d51461048a575f80fd5b8063456052671461041557806347ebf1081461043d575f80fd5b80632b35b3ac116102565780633c351e101161023c5780633c351e101461035a5780633cbc795b1461037f57806340b5de6c146103bd575f80fd5b80632b35b3ac1461032857806332c2d15314610345575f80fd5b8062d0295d14610286578063107bf28c146102a157806319d8ac61146102b657806326782247146102e3575b5f80fd5b61028e6106c0565b6040519081526020015b60405180910390f35b6102a96107da565b604051610298919061311f565b6007546102ca9067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610298565b6001546103039073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610298565b6008546103359060ff1681565b6040519015158152602001610298565b610358610353366004613178565b610866565b005b60085461030390610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546103a8907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610298565b6103e47fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610298565b6007546102ca90700100000000000000000000000000000000900467ffffffffffffffff1681565b61035861044b36600461329a565b610935565b6103037f000000000000000000000000000000000000000000000000000000000000000081565b61035861048536600461334a565b610ed9565b6102a96110f0565b6103586104a03660046133ad565b6110fd565b610358611a00565b61028e6104bb36600461334a565b60066020525f908152604090205481565b61028e60055481565b6103586104e33660046133f4565b611ae8565b610358611bb1565b6102a96104fe36600461340d565b611c83565b61030373a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103037f000000000000000000000000000000000000000000000000000000000000000081565b6103586105533660046133f4565b611efb565b61028e6405ca1ab1e081565b610358610572366004613444565b611fc4565b6007546102ca907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103586105b53660046134e0565b6122a2565b6002546103039073ffffffffffffffffffffffffffffffffffffffff1681565b6103037f000000000000000000000000000000000000000000000000000000000000000081565b6102a9612334565b61028e635ca1ab1e81565b610358610622366004613512565b612350565b6103037f000000000000000000000000000000000000000000000000000000000000000081565b6007546102ca9068010000000000000000900467ffffffffffffffff1681565b61035861067c366004613551565b61287c565b610689601b81565b60405160ff9091168152602001610298565b5f546103039062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561074c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061077091906135c2565b6007549091505f906107ae9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613606565b67ffffffffffffffff169050805f036107c9575f9250505090565b6107d3818361362e565b9250505090565b600480546107e790613666565b80601f016020809104026020016040519081016040528092919081815260200182805461081390613666565b801561085e5780601f106108355761010080835404028352916020019161085e565b820191905f5260205f20905b81548152906001019060200180831161084157829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146108d5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161092891815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109a4576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff16158080156109c257505f54600160ff909116105b806109db5750303b1580156109db57505f5460ff166001145b610a6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ac8575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610b4f8482613704565b506004610b5c8382613704565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610bf35763ffffffff841615610bf3576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790555f610c85878787611c83565b8051602080830191909120604080515f93810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015610e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e31919061381c565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a250505050508015610ecf575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f2f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610f76576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fdf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110039190613837565b61106c5760075467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061106c576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546107e790613666565b60025473ffffffffffffffffffffffffffffffffffffffff16331461114e576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611189576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156111c5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff8083169270010000000000000000000000000000000090041690815f5b858110156115f9575f89898381811061120c5761120c613856565b905060200281019061121e9190613883565b611227906138bf565b8051805160209091012060608201519192509067ffffffffffffffff16156113a757856112538161394d565b9650505f81836020015184606001516040516020016112aa93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114611332576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611388576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86165f908152600660205260408120556114e1565b60208201511580159061146b575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af1158015611445573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146991906135c2565b155b156114a2576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156114e1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080611514575042826040015167ffffffffffffffff16115b1561154b576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806115f190613973565b9150506111f1565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611650576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff868116919091179091556005839055859082811690851614611786575f6116a68386613606565b90506116bc67ffffffffffffffff8216836139aa565b915061173d7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166116f56106c0565b6116ff91906139c3565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612c63565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611882337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611815573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183991906135c2565b61184391906139c3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612d3c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156118e7575f80fd5b505af11580156118f9573d5f803e3d5ffd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff89166004820152602481018690525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303815f875af1158015611999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119bd919061381c565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a250505050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a56576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611a93576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611b3e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016110e5565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c02576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60605f604051806060016040528060218152602001613bd56021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe000000000000000000000000000000000000000000000000000000001790529051611d7a939291016139da565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611e05573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611e7d576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90611ec29084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613a08565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f51576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016110e5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314612033576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561205157505f54600160ff909116105b8061206a5750303b15801561206a57505f5460ff166001145b6120f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a63565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612152575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036121d98682613704565b5060046121e68582613704565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015612299575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122f8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036123048282613704565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516110e5919061311f565b604051806060016040528060218152602001613bd56021913981565b60085460ff1661238c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f8190036123c7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612403576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161243e918491700100000000000000000000000000000000900416613a63565b1115612476576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff16905f5b83811015612700575f8686838181106124b9576124b9613856565b90506020028101906124cb9190613a76565b6124d490613aa8565b9050836124e08161394d565b825180516020918201208185015160408087015190519499509194505f936125419386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146125c9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152600660205260408120556125ed6001886139aa565b840361265c5742600760189054906101000a900467ffffffffffffffff16846040015161261a9190613b23565b67ffffffffffffffff16111561265c576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806126f890613973565b91505061249e565b5061272e7f0000000000000000000000000000000000000000000000000000000000000000846116f56106c0565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e730000000000000000000000000000000000000000000000000000000081529084166004820152602481018290525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303815f875af1158015612819573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061283d919061381c565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff166128b8576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612922573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061294691906135c2565b905081811115612982576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156129be576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a0073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612d3c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a8e91906135c2565b600780549192506801000000000000000090910467ffffffffffffffff16906008612ab88361394d565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612aef929190613b44565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff165f9081526006909352912055323303612bfd576007546040805183815233602082015260609181018290525f918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612c5c565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612c539493929190613b53565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612d379084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612da0565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612d9a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612cb5565b50505050565b5f612e01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612eab9092919063ffffffff16565b805190915015612d375780806020019051810190612e1f9190613837565b612d37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a63565b6060612eb984845f85612ec1565b949350505050565b606082471015612f53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a63565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051612f7b9190613bc3565b5f6040518083038185875af1925050503d805f8114612fb5576040519150601f19603f3d011682016040523d82523d5f602084013e612fba565b606091505b5091509150612fcb87838387612fd6565b979650505050505050565b6060831561306b5782515f036130645773ffffffffffffffffffffffffffffffffffffffff85163b613064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a63565b5081612eb9565b612eb983838151156130805781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a63919061311f565b5f5b838110156130ce5781810151838201526020016130b6565b50505f910152565b5f81518084526130ed8160208601602086016130b4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61313160208301846130d6565b9392505050565b67ffffffffffffffff8116811461314d575f80fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff81168114613173575f80fd5b919050565b5f805f6060848603121561318a575f80fd5b833561319581613138565b9250602084013591506131aa60408501613150565b90509250925092565b803563ffffffff81168114613173575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112613202575f80fd5b813567ffffffffffffffff8082111561321d5761321d6131c6565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613263576132636131c6565b8160405283815286602085880101111561327b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156132b0575f80fd5b6132b988613150565b96506132c760208901613150565b95506132d5604089016131b3565b94506132e360608901613150565b93506132f1608089016131b3565b925060a088013567ffffffffffffffff8082111561330d575f80fd5b6133198b838c016131f3565b935060c08a013591508082111561332e575f80fd5b5061333b8a828b016131f3565b91505092959891949750929550565b5f6020828403121561335a575f80fd5b813561313181613138565b5f8083601f840112613375575f80fd5b50813567ffffffffffffffff81111561338c575f80fd5b6020830191508360208260051b85010111156133a6575f80fd5b9250929050565b5f805f604084860312156133bf575f80fd5b833567ffffffffffffffff8111156133d5575f80fd5b6133e186828701613365565b90945092506131aa905060208501613150565b5f60208284031215613404575f80fd5b61313182613150565b5f805f6060848603121561341f575f80fd5b613428846131b3565b925061343660208501613150565b91506131aa604085016131b3565b5f805f805f8060c08789031215613459575f80fd5b61346287613150565b955061347060208801613150565b9450604087013567ffffffffffffffff8082111561348c575f80fd5b6134988a838b016131f3565b955060608901359150808211156134ad575f80fd5b506134ba89828a016131f3565b9350506080870135915060a08701356134d281613138565b809150509295509295509295565b5f602082840312156134f0575f80fd5b813567ffffffffffffffff811115613506575f80fd5b612eb9848285016131f3565b5f8060208385031215613523575f80fd5b823567ffffffffffffffff811115613539575f80fd5b61354585828601613365565b90969095509350505050565b5f805f60408486031215613563575f80fd5b833567ffffffffffffffff8082111561357a575f80fd5b818601915086601f83011261358d575f80fd5b81358181111561359b575f80fd5b8760208285010111156135ac575f80fd5b6020928301989097509590910135949350505050565b5f602082840312156135d2575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613627576136276135d9565b5092915050565b5f82613661577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061367a57607f821691505b6020821081036136b1577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115612d37575f81815260208120601f850160051c810160208610156136dd5750805b601f850160051c820191505b818110156136fc578281556001016136e9565b505050505050565b815167ffffffffffffffff81111561371e5761371e6131c6565b6137328161372c8454613666565b846136b7565b602080601f831160018114613784575f841561374e5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556136fc565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156137d0578886015182559484019460019091019084016137b1565b508582101561380c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561382c575f80fd5b815161313181613138565b5f60208284031215613847575f80fd5b81518015158114613131575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126138b5575f80fd5b9190910192915050565b5f608082360312156138cf575f80fd5b6040516080810167ffffffffffffffff82821081831117156138f3576138f36131c6565b816040528435915080821115613907575f80fd5b50613914368286016131f3565b82525060208301356020820152604083013561392f81613138565b6040820152606083013561394281613138565b606082015292915050565b5f67ffffffffffffffff808316818103613969576139696135d9565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139a3576139a36135d9565b5060010190565b818103818111156139bd576139bd6135d9565b92915050565b80820281158282048414176139bd576139bd6135d9565b5f83516139eb8184602088016130b4565b8351908301906139ff8183602088016130b4565b01949350505050565b5f8651613a19818460208b016130b4565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156139bd576139bd6135d9565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126138b5575f80fd5b5f60608236031215613ab8575f80fd5b6040516060810167ffffffffffffffff8282108183111715613adc57613adc6131c6565b816040528435915080821115613af0575f80fd5b50613afd368286016131f3565b825250602083013560208201526040830135613b1881613138565b604082015292915050565b67ffffffffffffffff818116838216019080821115613627576136276135d9565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f82516138b58184602087016130b456fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220b3f4c696e2ee0627bf16c4769906e72a0ad489a88db43ecfbbda49859d292e2d64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610282575f3560e01c80638c3d730111610157578063cfa8ed47116100d2578063e46761c411610088578063eaeb077b1161006e578063eaeb077b1461066e578063f35dda4714610681578063f851a4401461069b575f80fd5b8063e46761c414610627578063e7a7ed021461064e575f80fd5b8063d690be31116100b8578063d690be3114610601578063d7bc90ff14610609578063d8d1091b14610614575f80fd5b8063cfa8ed47146105ba578063d02103ca146105da575f80fd5b8063ada8f91911610127578063bb5907081161010d578063bb59070814610564578063c754c7ed14610577578063c89e42df146105a7575f80fd5b8063ada8f91914610545578063b0afe15414610558575f80fd5b80638c3d7301146104e857806399af0397146104f05780639e00187714610503578063a3c573eb1461051e575f80fd5b806345605267116102015780635e9145c9116101b75780636b8616ce1161019d5780636b8616ce146104ad5780636e05d2cd146104cc5780636ff512cc146104d5575f80fd5b80635e9145c9146104925780635ec91958146104a5575f80fd5b806349b7b802116101e757806349b7b802146104505780634e48770614610477578063542028d51461048a575f80fd5b8063456052671461041557806347ebf1081461043d575f80fd5b80632b35b3ac116102565780633c351e101161023c5780633c351e101461035a5780633cbc795b1461037f57806340b5de6c146103bd575f80fd5b80632b35b3ac1461032857806332c2d15314610345575f80fd5b8062d0295d14610286578063107bf28c146102a157806319d8ac61146102b657806326782247146102e3575b5f80fd5b61028e6106c0565b6040519081526020015b60405180910390f35b6102a96107da565b604051610298919061311f565b6007546102ca9067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610298565b6001546103039073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610298565b6008546103359060ff1681565b6040519015158152602001610298565b610358610353366004613178565b610866565b005b60085461030390610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546103a8907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610298565b6103e47fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610298565b6007546102ca90700100000000000000000000000000000000900467ffffffffffffffff1681565b61035861044b36600461329a565b610935565b6103037f000000000000000000000000000000000000000000000000000000000000000081565b61035861048536600461334a565b610ed9565b6102a96110f0565b6103586104a03660046133ad565b6110fd565b610358611a00565b61028e6104bb36600461334a565b60066020525f908152604090205481565b61028e60055481565b6103586104e33660046133f4565b611ae8565b610358611bb1565b6102a96104fe36600461340d565b611c83565b61030373a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103037f000000000000000000000000000000000000000000000000000000000000000081565b6103586105533660046133f4565b611efb565b61028e6405ca1ab1e081565b610358610572366004613444565b611fc4565b6007546102ca907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103586105b53660046134e0565b6122a2565b6002546103039073ffffffffffffffffffffffffffffffffffffffff1681565b6103037f000000000000000000000000000000000000000000000000000000000000000081565b6102a9612334565b61028e635ca1ab1e81565b610358610622366004613512565b612350565b6103037f000000000000000000000000000000000000000000000000000000000000000081565b6007546102ca9068010000000000000000900467ffffffffffffffff1681565b61035861067c366004613551565b61287c565b610689601b81565b60405160ff9091168152602001610298565b5f546103039062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561074c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061077091906135c2565b6007549091505f906107ae9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613606565b67ffffffffffffffff169050805f036107c9575f9250505090565b6107d3818361362e565b9250505090565b600480546107e790613666565b80601f016020809104026020016040519081016040528092919081815260200182805461081390613666565b801561085e5780601f106108355761010080835404028352916020019161085e565b820191905f5260205f20905b81548152906001019060200180831161084157829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146108d5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161092891815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109a4576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff16158080156109c257505f54600160ff909116105b806109db5750303b1580156109db57505f5460ff166001145b610a6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ac8575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610b4f8482613704565b506004610b5c8382613704565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610bf35763ffffffff841615610bf3576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790555f610c85878787611c83565b8051602080830191909120604080515f93810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015610e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e31919061381c565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a250505050508015610ecf575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f2f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610f76576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fdf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110039190613837565b61106c5760075467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061106c576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546107e790613666565b60025473ffffffffffffffffffffffffffffffffffffffff16331461114e576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611189576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156111c5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff8083169270010000000000000000000000000000000090041690815f5b858110156115f9575f89898381811061120c5761120c613856565b905060200281019061121e9190613883565b611227906138bf565b8051805160209091012060608201519192509067ffffffffffffffff16156113a757856112538161394d565b9650505f81836020015184606001516040516020016112aa93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114611332576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611388576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86165f908152600660205260408120556114e1565b60208201511580159061146b575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af1158015611445573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146991906135c2565b155b156114a2576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156114e1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080611514575042826040015167ffffffffffffffff16115b1561154b576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806115f190613973565b9150506111f1565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611650576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff868116919091179091556005839055859082811690851614611786575f6116a68386613606565b90506116bc67ffffffffffffffff8216836139aa565b915061173d7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166116f56106c0565b6116ff91906139c3565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612c63565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611882337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611815573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183991906135c2565b61184391906139c3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612d3c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156118e7575f80fd5b505af11580156118f9573d5f803e3d5ffd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff89166004820152602481018690525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303815f875af1158015611999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119bd919061381c565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a250505050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a56576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611a93576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611b3e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016110e5565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c02576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60605f604051806060016040528060218152602001613bd56021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe000000000000000000000000000000000000000000000000000000001790529051611d7a939291016139da565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611e05573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611e7d576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90611ec29084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613a08565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f51576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016110e5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314612033576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561205157505f54600160ff909116105b8061206a5750303b15801561206a57505f5460ff166001145b6120f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a63565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612152575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036121d98682613704565b5060046121e68582613704565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015612299575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122f8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036123048282613704565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516110e5919061311f565b604051806060016040528060218152602001613bd56021913981565b60085460ff1661238c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f8190036123c7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612403576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161243e918491700100000000000000000000000000000000900416613a63565b1115612476576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff16905f5b83811015612700575f8686838181106124b9576124b9613856565b90506020028101906124cb9190613a76565b6124d490613aa8565b9050836124e08161394d565b825180516020918201208185015160408087015190519499509194505f936125419386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146125c9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152600660205260408120556125ed6001886139aa565b840361265c5742600760189054906101000a900467ffffffffffffffff16846040015161261a9190613b23565b67ffffffffffffffff16111561265c576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806126f890613973565b91505061249e565b5061272e7f0000000000000000000000000000000000000000000000000000000000000000846116f56106c0565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e730000000000000000000000000000000000000000000000000000000081529084166004820152602481018290525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303815f875af1158015612819573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061283d919061381c565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff166128b8576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612922573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061294691906135c2565b905081811115612982576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156129be576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a0073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612d3c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a8e91906135c2565b600780549192506801000000000000000090910467ffffffffffffffff16906008612ab88361394d565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612aef929190613b44565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff165f9081526006909352912055323303612bfd576007546040805183815233602082015260609181018290525f918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612c5c565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612c539493929190613b53565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612d379084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612da0565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612d9a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612cb5565b50505050565b5f612e01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612eab9092919063ffffffff16565b805190915015612d375780806020019051810190612e1f9190613837565b612d37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a63565b6060612eb984845f85612ec1565b949350505050565b606082471015612f53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a63565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051612f7b9190613bc3565b5f6040518083038185875af1925050503d805f8114612fb5576040519150601f19603f3d011682016040523d82523d5f602084013e612fba565b606091505b5091509150612fcb87838387612fd6565b979650505050505050565b6060831561306b5782515f036130645773ffffffffffffffffffffffffffffffffffffffff85163b613064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a63565b5081612eb9565b612eb983838151156130805781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a63919061311f565b5f5b838110156130ce5781810151838201526020016130b6565b50505f910152565b5f81518084526130ed8160208601602086016130b4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61313160208301846130d6565b9392505050565b67ffffffffffffffff8116811461314d575f80fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff81168114613173575f80fd5b919050565b5f805f6060848603121561318a575f80fd5b833561319581613138565b9250602084013591506131aa60408501613150565b90509250925092565b803563ffffffff81168114613173575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112613202575f80fd5b813567ffffffffffffffff8082111561321d5761321d6131c6565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613263576132636131c6565b8160405283815286602085880101111561327b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156132b0575f80fd5b6132b988613150565b96506132c760208901613150565b95506132d5604089016131b3565b94506132e360608901613150565b93506132f1608089016131b3565b925060a088013567ffffffffffffffff8082111561330d575f80fd5b6133198b838c016131f3565b935060c08a013591508082111561332e575f80fd5b5061333b8a828b016131f3565b91505092959891949750929550565b5f6020828403121561335a575f80fd5b813561313181613138565b5f8083601f840112613375575f80fd5b50813567ffffffffffffffff81111561338c575f80fd5b6020830191508360208260051b85010111156133a6575f80fd5b9250929050565b5f805f604084860312156133bf575f80fd5b833567ffffffffffffffff8111156133d5575f80fd5b6133e186828701613365565b90945092506131aa905060208501613150565b5f60208284031215613404575f80fd5b61313182613150565b5f805f6060848603121561341f575f80fd5b613428846131b3565b925061343660208501613150565b91506131aa604085016131b3565b5f805f805f8060c08789031215613459575f80fd5b61346287613150565b955061347060208801613150565b9450604087013567ffffffffffffffff8082111561348c575f80fd5b6134988a838b016131f3565b955060608901359150808211156134ad575f80fd5b506134ba89828a016131f3565b9350506080870135915060a08701356134d281613138565b809150509295509295509295565b5f602082840312156134f0575f80fd5b813567ffffffffffffffff811115613506575f80fd5b612eb9848285016131f3565b5f8060208385031215613523575f80fd5b823567ffffffffffffffff811115613539575f80fd5b61354585828601613365565b90969095509350505050565b5f805f60408486031215613563575f80fd5b833567ffffffffffffffff8082111561357a575f80fd5b818601915086601f83011261358d575f80fd5b81358181111561359b575f80fd5b8760208285010111156135ac575f80fd5b6020928301989097509590910135949350505050565b5f602082840312156135d2575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613627576136276135d9565b5092915050565b5f82613661577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061367a57607f821691505b6020821081036136b1577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115612d37575f81815260208120601f850160051c810160208610156136dd5750805b601f850160051c820191505b818110156136fc578281556001016136e9565b505050505050565b815167ffffffffffffffff81111561371e5761371e6131c6565b6137328161372c8454613666565b846136b7565b602080601f831160018114613784575f841561374e5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556136fc565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156137d0578886015182559484019460019091019084016137b1565b508582101561380c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561382c575f80fd5b815161313181613138565b5f60208284031215613847575f80fd5b81518015158114613131575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126138b5575f80fd5b9190910192915050565b5f608082360312156138cf575f80fd5b6040516080810167ffffffffffffffff82821081831117156138f3576138f36131c6565b816040528435915080821115613907575f80fd5b50613914368286016131f3565b82525060208301356020820152604083013561392f81613138565b6040820152606083013561394281613138565b606082015292915050565b5f67ffffffffffffffff808316818103613969576139696135d9565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139a3576139a36135d9565b5060010190565b818103818111156139bd576139bd6135d9565b92915050565b80820281158282048414176139bd576139bd6135d9565b5f83516139eb8184602088016130b4565b8351908301906139ff8183602088016130b4565b01949350505050565b5f8651613a19818460208b016130b4565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156139bd576139bd6135d9565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126138b5575f80fd5b5f60608236031215613ab8575f80fd5b6040516060810167ffffffffffffffff8282108183111715613adc57613adc6131c6565b816040528435915080821115613af0575f80fd5b50613afd368286016131f3565b825250602083013560208201526040830135613b1881613138565b604082015292915050565b67ffffffffffffffff818116838216019080821115613627576136276135d9565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f82516138b58184602087016130b456fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220b3f4c696e2ee0627bf16c4769906e72a0ad489a88db43ecfbbda49859d292e2d64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/TokenWrapped.json b/compiled-contracts/TokenWrapped.json index b690c2af6..72e165a2a 100644 --- a/compiled-contracts/TokenWrapped.json +++ b/compiled-contracts/TokenWrapped.json @@ -471,8 +471,8 @@ "type": "function" } ], - "bytecode": "0x61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033", + "bytecode": "0x61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/VerifierRollupHelperMock.json b/compiled-contracts/VerifierRollupHelperMock.json index f78d13449..fcfa7ed2a 100644 --- a/compiled-contracts/VerifierRollupHelperMock.json +++ b/compiled-contracts/VerifierRollupHelperMock.json @@ -24,12 +24,12 @@ "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b5061014e8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004361003b366004610084565b600192915050565b604051901515815260200160405180910390f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80610320808486031215610097575f80fd5b6103008401858111156100a8575f80fd5b8493508561031f8601126100ba575f80fd5b604051602080820182811067ffffffffffffffff821117156100de576100de610057565b6040529286019281888511156100f2575f80fd5b5b8484101561010a57833581529281019281016100f3565b50949790965094505050505056fea2646970667358221220b573319b6682fcc2f0db0c066055eb5cedcf703eed96af2d16f8d3320abc1bb564736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004361003b366004610084565b600192915050565b604051901515815260200160405180910390f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80610320808486031215610097575f80fd5b6103008401858111156100a8575f80fd5b8493508561031f8601126100ba575f80fd5b604051602080820182811067ffffffffffffffff821117156100de576100de610057565b6040529286019281888511156100f2575f80fd5b5b8484101561010a57833581529281019281016100f3565b50949790965094505050505056fea2646970667358221220b573319b6682fcc2f0db0c066055eb5cedcf703eed96af2d16f8d3320abc1bb564736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b5061014e8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004361003b366004610084565b600192915050565b604051901515815260200160405180910390f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80610320808486031215610097575f80fd5b6103008401858111156100a8575f80fd5b8493508561031f8601126100ba575f80fd5b604051602080820182811067ffffffffffffffff821117156100de576100de610057565b6040529286019281888511156100f2575f80fd5b5b8484101561010a57833581529281019281016100f3565b50949790965094505050505056fea26469706673582212200c852f4a1d01c92e0fb5e8f4280798a001f24ebd189c2b9b048aabb0266d233764736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004361003b366004610084565b600192915050565b604051901515815260200160405180910390f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80610320808486031215610097575f80fd5b6103008401858111156100a8575f80fd5b8493508561031f8601126100ba575f80fd5b604051602080820182811067ffffffffffffffff821117156100de576100de610057565b6040529286019281888511156100f2575f80fd5b5b8484101561010a57833581529281019281016100f3565b50949790965094505050505056fea26469706673582212200c852f4a1d01c92e0fb5e8f4280798a001f24ebd189c2b9b048aabb0266d233764736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/docs/PolygonZkEVM.md b/docs/PolygonZkEVM.md index 6a41864a1..748e23b83 100644 --- a/docs/PolygonZkEVM.md +++ b/docs/PolygonZkEVM.md @@ -214,7 +214,7 @@ with the same nonce ### sequenceForceBatches ```solidity function sequenceForceBatches( - struct PolygonZkEVM.BatchData[] batches + struct PolygonZkEVM.ForcedBatchData[] batches ) external ``` Allows anyone to sequence forced Batches if the trusted sequencer has not done so in the timeout period @@ -223,7 +223,7 @@ Allows anyone to sequence forced Batches if the trusted sequencer has not done s #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`batches` | struct PolygonZkEVM.BatchData[] | Struct array which holds the necessary data to append force batches +|`batches` | struct PolygonZkEVM.ForcedBatchData[] | Struct array which holds the necessary data to append force batches ### setTrustedSequencer ```solidity diff --git a/docs/PolygonZkEVMBridge.md b/docs/PolygonZkEVMBridge.md index 19105a011..5a94edf48 100644 --- a/docs/PolygonZkEVMBridge.md +++ b/docs/PolygonZkEVMBridge.md @@ -34,6 +34,10 @@ emergency state is not possible for the L2 deployment of the bridge, intentional ) public ``` Deposit add a new leaf to the merkle tree +note If this function is called with a reentrant token, it would be possible to `claimTokens` in the same call +Reducing the supply of tokens on this contract, and actually locking tokens in the contract. +Therefore we recommend to third parties bridges that if they do implement reentrant call of `beforeTransfer` of some reentrant tokens +do not call any external address in that case #### Parameters: diff --git a/docs/PolygonZkEVMGlobalExitRoot.md b/docs/PolygonZkEVMGlobalExitRoot.md index 4156d1be2..dd9e76c09 100644 --- a/docs/PolygonZkEVMGlobalExitRoot.md +++ b/docs/PolygonZkEVMGlobalExitRoot.md @@ -40,15 +40,6 @@ Return last global exit root -### getRoot -```solidity - function getRoot( - ) public returns (bytes32) -``` -Computes and returns the merkle root - - - ## Events ### UpdateGlobalExitRoot ```solidity diff --git a/docs/lib/DepositContract.md b/docs/lib/DepositContract.md index 9b73756b0..09007366e 100644 --- a/docs/lib/DepositContract.md +++ b/docs/lib/DepositContract.md @@ -3,6 +3,49 @@ Based on the implementation of the deposit eth2.0 contract https://github.com/et ## Functions +### getDepositRoot +```solidity + function getDepositRoot( + ) public returns (bytes32) +``` +Computes and returns the merkle root + + + +### _deposit +```solidity + function _deposit( + bytes32 leafHash + ) internal +``` +Add a new leaf to the merkle tree + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`leafHash` | bytes32 | Leaf hash + +### verifyMerkleProof +```solidity + function verifyMerkleProof( + bytes32 leafHash, + bytes32[32] smtProof, + uint32 index, + bytes32 root + ) public returns (bool) +``` +Verify merkle proof + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`leafHash` | bytes32 | Leaf hash +|`smtProof` | bytes32[32] | Smt proof +|`index` | uint32 | Index of the leaf +|`root` | bytes32 | Merkle root + ### getLeafValue ```solidity function getLeafValue( diff --git a/docs/v2/PolygonRollupManager.md b/docs/v2/PolygonRollupManager.md index e3fc5ff38..243665578 100644 --- a/docs/v2/PolygonRollupManager.md +++ b/docs/v2/PolygonRollupManager.md @@ -6,8 +6,9 @@ Contract responsible for managing the exit roots across multiple Rollups ```solidity function constructor( contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + contract IERC20Upgradeable _pol, contract IPolygonZkEVMBridge _bridgeAddress - ) internal + ) public ``` @@ -15,87 +16,83 @@ Contract responsible for managing the exit roots across multiple Rollups | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | |`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | MATIC token address |`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address ### initialize ```solidity function initialize( + address trustedAggregator, + uint64 _pendingStateTimeout, + uint64 _trustedAggregatorTimeout, + address admin, + address timelock, + address emergencyCouncil, + contract PolygonZkEVMV2Existent polygonZkEVM, + contract IVerifierRollup zkEVMVerifier ) external ``` - - -### addNewConsensus -```solidity - function addNewConsensus( - address newConsensusAddress, - string description - ) external -``` -Add a new consensus implementation contract -This contract will be used as base for the new created Rollups - - #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`newConsensusAddress` | address | new exit tree root -|`description` | string | description of the consensus - -### addNewVerifier -```solidity - function addNewVerifier( - address newVerifierAddress +|`trustedAggregator` | address | Trusted aggregatot address +|`_pendingStateTimeout` | uint64 | Pending state timeout +|`_trustedAggregatorTimeout` | uint64 | Trusted aggregator timeout +|`admin` | address | Admin of the rollup manager +|`timelock` | address | Timelock address +|`emergencyCouncil` | address | Emergency council address +|`polygonZkEVM` | contract PolygonZkEVMV2Existent | New deployed Polygon zkEVM which will be initialized wiht previous values +|`zkEVMVerifier` | contract IVerifierRollup | Verifier of the new zkEVM deployed + +### addNewRollupType +```solidity + function addNewRollupType( + address consensusImplementation, + contract IVerifierRollup verifier, + uint64 forkID, + uint8 genesis, + bytes32 description ) external ``` -Add a new vefifier contract +Add a new rollup type #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`newVerifierAddress` | address | new verifier address +|`consensusImplementation` | address | consensus implementation +|`verifier` | contract IVerifierRollup | verifier address +|`forkID` | uint64 | forkID of the verifier +|`genesis` | uint8 | genesis block of the rollup +|`description` | bytes32 | description of the rollup type -### deleteConsensus +### obsoleteRollupType ```solidity - function deleteConsensus( - address consensusAddress + function obsoleteRollupType( + uint32 rollupTypeID ) external ``` -Delete Conensus +Obsolete Rollup type #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`consensusAddress` | address | Consensus address to delete - -### deleteVerifier -```solidity - function deleteVerifier( - address verifierAddress - ) external -``` -Delete Verifier - - -#### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`verifierAddress` | address | Verifier address to delete +|`rollupTypeID` | uint32 | Rollup type to obsolete ### createNewRollup ```solidity function createNewRollup( - address consensusAddress, - address verifierAddress, - uint64 _admin, - address _trustedSequencer, - address _feeToken, - contract IERC20Upgradeable _trustedSequencerURL, - string _networkName, - string _version + uint32 rollupTypeID, + uint64 chainID, + address admin, + address sequencer, + address gasTokenAddress, + uint32 gasTokenNetwork, + string sequencerURL, + string networkName ) external ``` Create a new rollup @@ -104,80 +101,87 @@ Create a new rollup #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`consensusAddress` | address | consensus implementation address -|`verifierAddress` | address | chainID -|`_admin` | uint64 | admin of the new created rollup -|`_trustedSequencer` | address | trusted sequencer of the new created rollup -|`_feeToken` | address | fee token of the new created rollup -|`_trustedSequencerURL` | contract IERC20Upgradeable | trusted sequencer URL of the new created rollup -|`_networkName` | string | network name of the new created rollup -|`_version` | string | version string of the new created rollup +|`rollupTypeID` | uint32 | Rollup type to deploy +|`chainID` | uint64 | chainID of the rollup, must be a new one +|`admin` | address | admin of the new created rollup +|`sequencer` | address | sequencer of the new created rollup +|`gasTokenAddress` | address | Indicates the token address that will be used to pay gas fees in the new rollup +|`gasTokenNetwork` | uint32 | Indicates the native network of the token address +|`sequencerURL` | string | sequencer URL of the new created rollup +|`networkName` | string | network name of the new created rollup ### addExistingRollup ```solidity function addExistingRollup( - address rollupAddress, - address verifierAddress, - uint64 chainID + contract IPolygonRollupBase rollupAddress, + contract IVerifierRollup verifier, + uint64 forkID, + uint64 chainID, + bytes32 genesis, + uint8 rollupCompatibilityID ) external ``` -Add a new vefifier contract +Add an already deployed rollup +note that this rollup does not follow any rollupType #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`rollupAddress` | address | rollup address -|`verifierAddress` | address | verifier address, must be added before -|`chainID` | uint64 | chain id of the created rollup +|`rollupAddress` | contract IPolygonRollupBase | rollup address +|`verifier` | contract IVerifierRollup | verifier address, must be added before +|`forkID` | uint64 | fork id of the added rollup +|`chainID` | uint64 | chain id of the added rollup +|`genesis` | bytes32 | genesis block for this rollup +|`rollupCompatibilityID` | uint8 | compatibility ID for the added rollup -### upgradeRollupImplementation +### _addExistingRollup ```solidity - function upgradeRollupImplementation( - contract TransparentUpgradeableProxy rollupAddress, - address newConsensusAddress, - bytes upgradeData - ) external + function _addExistingRollup( + contract IPolygonRollupBase rollupAddress, + contract IVerifierRollup verifier, + uint64 forkID, + uint64 chainID, + uint8 rollupCompatibilityID + ) internal returns (struct PolygonRollupManager.RollupData rollup) ``` -Upgrade an existing rollup +Add an already deployed rollup +note that this rollup does not follow any rollupType #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`rollupAddress` | contract TransparentUpgradeableProxy | Rollup consensus proxy address -|`newConsensusAddress` | address | new implementation of the consensus -|`upgradeData` | bytes | Upgrade data +|`rollupAddress` | contract IPolygonRollupBase | rollup address +|`verifier` | contract IVerifierRollup | verifier address, must be added before +|`forkID` | uint64 | fork id of the added rollup +|`chainID` | uint64 | chain id of the added rollup +|`rollupCompatibilityID` | uint8 | compatibility ID for the added rollup -### upgradeRollupVerifier +### updateRollup ```solidity - function upgradeRollupVerifier( - address newVerifierAddress + function updateRollup( + contract ITransparentUpgradeableProxy rollupContract, + uint32 newRollupTypeID, + bytes upgradeData ) external ``` -Add a new vefifier contract +Upgrade an existing rollup #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`newVerifierAddress` | address | new verifier address - -### getRollupExitRoot -```solidity - function getRollupExitRoot( - ) public returns (bytes32) -``` -get the current rollup exit root - - +|`rollupContract` | contract ITransparentUpgradeableProxy | Rollup consensus proxy address +|`newRollupTypeID` | uint32 | New rolluptypeID to upgrade to +|`upgradeData` | bytes | Upgrade data ### onSequenceBatches ```solidity function onSequenceBatches( - uint64 newSequencedBatch, + uint64 newSequencedBatches, bytes32 newAccInputHash - ) external + ) external returns (uint64) ``` Sequence batches, callback called by one of the consensus managed by this contract @@ -185,18 +189,20 @@ Sequence batches, callback called by one of the consensus managed by this contra #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`newSequencedBatch` | uint64 | new sequenced batch +|`newSequencedBatches` | uint64 | how many sequenced batches were sequenced |`newAccInputHash` | bytes32 | new accumualted input hash ### verifyBatches ```solidity function verifyBatches( + uint32 rollupID, uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, - uint64 newLocalExitRoot, + bytes32 newLocalExitRoot, bytes32 newStateRoot, - bytes32 proof + address beneficiary, + bytes32[24] proof ) external ``` Allows an aggregator to verify multiple batches @@ -205,22 +211,26 @@ Allows an aggregator to verify multiple batches #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | +|`rollupID` | uint32 | Rollup identifier |`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used |`initNumBatch` | uint64 | Batch which the aggregator starts the verification |`finalNewBatch` | uint64 | Last batch aggregator intends to verify -|`newLocalExitRoot` | uint64 | New local exit root once the batch is processed +|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed -|`proof` | bytes32 | fflonk proof +|`beneficiary` | address | Address that will receive the verification reward +|`proof` | bytes32[24] | fflonk proof ### verifyBatchesTrustedAggregator ```solidity function verifyBatchesTrustedAggregator( + uint32 rollupID, uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, - uint64 newLocalExitRoot, + bytes32 newLocalExitRoot, bytes32 newStateRoot, - bytes32 proof + address beneficiary, + bytes32[24] proof ) external ``` Allows an aggregator to verify multiple batches @@ -229,22 +239,25 @@ Allows an aggregator to verify multiple batches #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | +|`rollupID` | uint32 | Rollup identifier |`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used |`initNumBatch` | uint64 | Batch which the aggregator starts the verification |`finalNewBatch` | uint64 | Last batch aggregator intends to verify -|`newLocalExitRoot` | uint64 | New local exit root once the batch is processed +|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed -|`proof` | bytes32 | fflonk proof +|`beneficiary` | address | Address that will receive the verification reward +|`proof` | bytes32[24] | fflonk proof ### _verifyAndRewardBatches ```solidity function _verifyAndRewardBatches( - struct PolygonRollupManager.RollupData pendingStateNum, + struct PolygonRollupManager.RollupData rollup, + uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, - uint64 newLocalExitRoot, + bytes32 newLocalExitRoot, bytes32 newStateRoot, - bytes32 proof + address proof ) internal ``` Verify and reward batches internal function @@ -253,12 +266,13 @@ Verify and reward batches internal function #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`pendingStateNum` | struct PolygonRollupManager.RollupData | Init pending state, 0 if consolidated state is used +|`rollup` | struct PolygonRollupManager.RollupData | Rollup Data struct that will be used to the verification +|`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used |`initNumBatch` | uint64 | Batch which the aggregator starts the verification |`finalNewBatch` | uint64 | Last batch aggregator intends to verify -|`newLocalExitRoot` | uint64 | New local exit root once the batch is processed +|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed -|`proof` | bytes32 | fflonk proof +|`proof` | address | fflonk proof ### _tryConsolidatePendingState ```solidity @@ -273,7 +287,7 @@ It tries to consolidate the first and the middle pending state in the queue ### consolidatePendingState ```solidity function consolidatePendingState( - uint64 pendingStateNum + uint32 pendingStateNum ) external ``` Allows to consolidate any pending state that has already exceed the pendingStateTimeout @@ -283,7 +297,7 @@ Can be called by the trusted aggregator, which can consolidate any state without #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`pendingStateNum` | uint64 | Pending state to consolidate +|`pendingStateNum` | uint32 | Pending state to consolidate ### _consolidatePendingState ```solidity @@ -302,13 +316,14 @@ Internal function to consolidate any pending state that has already exceed the p ### overridePendingState ```solidity function overridePendingState( + uint32 rollupID, uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, - uint64 newLocalExitRoot, + bytes32 newLocalExitRoot, bytes32 newStateRoot, - bytes32 proof + bytes32[24] proof ) external ``` Allows the trusted aggregator to override the pending state @@ -318,24 +333,26 @@ if it's possible to prove a different state root given the same batches #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | +|`rollupID` | uint32 | Rollup identifier |`initPendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used |`finalPendingStateNum` | uint64 | Final pending state, that will be used to compare with the newStateRoot |`initNumBatch` | uint64 | Batch which the aggregator starts the verification |`finalNewBatch` | uint64 | Last batch aggregator intends to verify -|`newLocalExitRoot` | uint64 | New local exit root once the batch is processed +|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed -|`proof` | bytes32 | fflonk proof +|`proof` | bytes32[24] | fflonk proof ### proveNonDeterministicPendingState ```solidity function proveNonDeterministicPendingState( + uint32 rollupID, uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, - uint64 newLocalExitRoot, + bytes32 newLocalExitRoot, bytes32 newStateRoot, - bytes32 proof + bytes32[24] proof ) external ``` Allows to halt the PolygonZkEVM if its possible to prove a different state root given the same batches @@ -344,24 +361,26 @@ Allows to halt the PolygonZkEVM if its possible to prove a different state root #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | +|`rollupID` | uint32 | Rollup identifier |`initPendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used |`finalPendingStateNum` | uint64 | Final pending state, that will be used to compare with the newStateRoot |`initNumBatch` | uint64 | Batch which the aggregator starts the verification |`finalNewBatch` | uint64 | Last batch aggregator intends to verify -|`newLocalExitRoot` | uint64 | New local exit root once the batch is processed +|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed -|`proof` | bytes32 | fflonk proof +|`proof` | bytes32[24] | fflonk proof ### _proveDistinctPendingState ```solidity function _proveDistinctPendingState( - struct PolygonRollupManager.RollupData initPendingStateNum, + struct PolygonRollupManager.RollupData rollup, + uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, - uint64 newLocalExitRoot, + bytes32 newLocalExitRoot, bytes32 newStateRoot, - bytes32 proof + bytes32[24] proof ) internal ``` Internal function that proves a different state root given the same batches to verify @@ -370,28 +389,39 @@ Internal function that proves a different state root given the same batches to v #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`initPendingStateNum` | struct PolygonRollupManager.RollupData | Init pending state, 0 if consolidated state is used +|`rollup` | struct PolygonRollupManager.RollupData | Rollup Data struct that will be checked +|`initPendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used |`finalPendingStateNum` | uint64 | Final pending state, that will be used to compare with the newStateRoot |`initNumBatch` | uint64 | Batch which the aggregator starts the verification |`finalNewBatch` | uint64 | Last batch aggregator intends to verify -|`newLocalExitRoot` | uint64 | New local exit root once the batch is processed +|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed -|`proof` | bytes32 | fflonk proof +|`proof` | bytes32[24] | fflonk proof + +### _updateBatchFee +```solidity + function _updateBatchFee( + struct PolygonRollupManager.RollupData newLastVerifiedBatch + ) internal +``` +Function to update the batch fee based on the new verified batches +The batch fee will not be updated when the trusted aggregator verifies batches + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newLastVerifiedBatch` | struct PolygonRollupManager.RollupData | New last verified batch ### activateEmergencyState ```solidity function activateEmergencyState( - uint64 sequencedBatchNum ) external ``` Function to activate emergency state, which also enables the emergency mode on both PolygonZkEVM and PolygonZkEVMBridge contracts -If not called by the owner must be provided a batcnNum that does not have been aggregated in a _HALT_AGGREGATION_TIMEOUT period +If not called by the owner must not have been aggregated in a _HALT_AGGREGATION_TIMEOUT period -#### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`sequencedBatchNum` | uint64 | Sequenced batch number that has not been aggreagated in _HALT_AGGREGATION_TIMEOUT ### deactivateEmergencyState ```solidity @@ -441,27 +471,60 @@ The timeout can only be lowered, except if emergency state is active | :--- | :--- | :------------------------------------------------------------------- | |`newPendingStateTimeout` | uint64 | Trusted aggregator timeout -### transferGovernanceRole +### setMultiplierBatchFee ```solidity - function transferGovernanceRole( - address newPendingGovernance + function setMultiplierBatchFee( + uint16 newMultiplierBatchFee ) external ``` -Starts the Governance role transfer -This is a two step process, the pending Governance must accepted to finalize the process +Allow the admin to set a new multiplier batch fee #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`newPendingGovernance` | address | Address of the new pending Governance +|`newMultiplierBatchFee` | uint16 | multiplier batch fee -### acceptGovernanceRole +### setVerifyBatchTimeTarget ```solidity - function acceptGovernanceRole( + function setVerifyBatchTimeTarget( + uint64 newVerifyBatchTimeTarget ) external ``` -Allow the current pending Governance to accept the Governance role +Allow the admin to set a new verify batch time target +This value will only be relevant once the aggregation is decentralized, so +the trustedAggregatorTimeout should be zero or very close to zero + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newVerifyBatchTimeTarget` | uint64 | Verify batch time target + +### setBatchFee +```solidity + function setBatchFee( + uint256 newBatchFee + ) external +``` +Allow to corresponding role to set the current batch fee + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newBatchFee` | uint256 | new batch fee + +### getRollupExitRoot +```solidity + function getRollupExitRoot( + ) public returns (bytes32) +``` +Get the current rollup exit root +Compute using all the local exit roots of all rollups the rollup exit root +Since it's expected to have no more than 10 rollups in this first version, even if this approach +has a gas consumption that scales linearly with the rollups added, it's ok +In a future versions this computation will be done inside the circuit @@ -503,10 +566,39 @@ Note that his function does not check if the pending state currently exists, or +### calculateRewardPerBatch +```solidity + function calculateRewardPerBatch( + ) public returns (uint256) +``` +Function to calculate the reward to verify a single batch + + + +### getBatchFee +```solidity + function getBatchFee( + ) public returns (uint256) +``` +Get batch fee +This function is used instad of the automatic public view one, +because in a future might change the behaviour and we will be able to mantain the interface + + + +### getForcedBatchFee +```solidity + function getForcedBatchFee( + ) public returns (uint256) +``` +Get forced batch fee + + + ### getInputSnarkBytes ```solidity function getInputSnarkBytes( - uint64 initNumBatch, + uint32 initNumBatch, uint64 finalNewBatch, uint64 newLocalExitRoot, bytes32 oldStateRoot, @@ -519,7 +611,7 @@ Function to calculate the input snark bytes #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`initNumBatch` | uint64 | Batch which the aggregator starts the verification +|`initNumBatch` | uint32 | Batch which the aggregator starts the verification |`finalNewBatch` | uint64 | Last batch aggregator intends to verify |`newLocalExitRoot` | uint64 | New local exit root once the batch is processed |`oldStateRoot` | bytes32 | State root before batch is processed @@ -547,63 +639,82 @@ Function to calculate the input snark bytes |`oldStateRoot` | bytes32 | State root before batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed -### checkStateRootInsidePrime +### _checkStateRootInsidePrime ```solidity - function checkStateRootInsidePrime( - ) public returns (bool) + function _checkStateRootInsidePrime( + ) internal returns (bool) ``` -## Events -### AddNewConsensus +### getRollupBatchNumToStateRoot ```solidity - event AddNewConsensus( - ) + function getRollupBatchNumToStateRoot( + ) public returns (bytes32) +``` +Get the last verified batch + + + +### getRollupSequencedBatches +```solidity + function getRollupSequencedBatches( + ) public returns (struct LegacyZKEVMStateVariables.SequencedBatchData) ``` +Get the last verified batch + + + +### getRollupPendingStateTransitions +```solidity + function getRollupPendingStateTransitions( + ) public returns (struct LegacyZKEVMStateVariables.PendingState) +``` +Get the last verified batch + -Emitted when a new consensus is added -### AddNewVerifier +## Events +### AddNewRollupType ```solidity - event AddNewVerifier( + event AddNewRollupType( ) ``` -Emitted when a new consensus is added +Emitted when a new rollup type is added -### DeleteConsensus +### ObsoleteRollupType ```solidity - event DeleteConsensus( + event ObsoleteRollupType( ) ``` -Emitted when a new verifier is added +Emitted when a a rolup type is deleted -### DeleteVerifier +### CreateNewRollup ```solidity - event DeleteVerifier( + event CreateNewRollup( ) ``` -Emitted when a new verifier is added +Emitted when a new rollup is created based on a rollupType -### AddNewRollup +### AddExistingRollup ```solidity - event AddNewRollup( + event AddExistingRollup( ) ``` -Emitted when a new verifier is added +Emitted when an existing rollup is added -### RollupUpgraded +### UpdateRollup ```solidity - event RollupUpgraded( + event UpdateRollup( ) ``` -Emitted when a new verifier is added +Emitted when a rollup is udpated ### OnSequenceBatches ```solidity @@ -669,14 +780,6 @@ Emitted when the admin updates the trusted aggregator timeout Emitted when the admin updates the pending state timeout -### SetTrustedAggregator -```solidity - event SetTrustedAggregator( - ) -``` - -Emitted when the admin updates the trusted aggregator address - ### SetMultiplierBatchFee ```solidity event SetMultiplierBatchFee( @@ -693,19 +796,19 @@ Emitted when the admin updates the multiplier batch fee Emitted when the admin updates the verify batch timeout -### TransferGovernanceRole +### SetTrustedAggregator ```solidity - event TransferGovernanceRole( + event SetTrustedAggregator( ) ``` -Emitted when the governance starts the two-step transfer role setting a new pending governance +Emitted when the admin updates the trusted aggregator address -### AcceptGovernanceRole +### SetBatchFee ```solidity - event AcceptGovernanceRole( + event SetBatchFee( ) ``` -Emitted when the pending Governance accepts the Governance role +Emitted when the batch fee is set diff --git a/docs/v2/PolygonZkEVMBridgeV2.md b/docs/v2/PolygonZkEVMBridgeV2.md index 74e482f3c..5a033b0b8 100644 --- a/docs/v2/PolygonZkEVMBridgeV2.md +++ b/docs/v2/PolygonZkEVMBridgeV2.md @@ -7,6 +7,8 @@ Contract responsible to manage the token interactions with other networks ```solidity function initialize( uint32 _networkID, + address _gasTokenAddress, + uint32 _gasTokenNetwork, contract IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, address _polygonRollupManager ) external @@ -18,6 +20,8 @@ emergency state is not possible for the L2 deployment of the bridge, intentional | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | |`_networkID` | uint32 | networkID +|`_gasTokenAddress` | address | gas token address +|`_gasTokenNetwork` | uint32 | gas token network |`_globalExitRootManager` | contract IBasePolygonZkEVMGlobalExitRoot | global exit root manager address |`_polygonRollupManager` | address | polygonZkEVM address @@ -34,6 +38,10 @@ emergency state is not possible for the L2 deployment of the bridge, intentional ) public ``` Deposit add a new leaf to the merkle tree +note If this function is called with a reentrant token, it would be possible to `claimTokens` in the same call +Reducing the supply of tokens on this contract, and actually locking tokens in the contract. +Therefore we recommend to third parties bridges that if they do implement reentrant call of `beforeTransfer` of some reentrant tokens +do not call any external address in that case #### Parameters: @@ -66,6 +74,50 @@ Bridge message and send ETH value |`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not |`metadata` | bytes | Message metadata +### bridgeMessageWETH +```solidity + function bridgeMessageWETH( + uint32 destinationNetwork, + address destinationAddress, + uint256 amountWETH, + bool forceUpdateGlobalExitRoot, + bytes metadata + ) external +``` +Bridge message and send ETH value + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`amountWETH` | uint256 | Amount of WETH tokens +|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not +|`metadata` | bytes | Message metadata + +### _bridgeMessage +```solidity + function _bridgeMessage( + uint32 destinationNetwork, + address destinationAddress, + uint256 amountEther, + bool forceUpdateGlobalExitRoot, + bytes metadata + ) internal +``` +Bridge message and send ETH value + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`amountEther` | uint256 | Amount of ether along with the message +|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not +|`metadata` | bytes | Message metadata + ### claimAsset ```solidity function claimAsset( @@ -88,9 +140,14 @@ Verify merkle proof and withdraw tokens/ether #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`smtProofLocalExitRoot` | bytes32[32] | Smt proof -|`smtProofRollupExitRoot` | bytes32[32] | Smt proof -|`globalIndex` | uint256 | Global index: bool(isMainnet)||uint32(indexRollupRoot)||uint32(indexDepositLeaf) +|`smtProofLocalExitRoot` | bytes32[32] | Smt proof to proof the leaf agains the exit root +|`smtProofRollupExitRoot` | bytes32[32] | Smt proof to proof the rollupLocalExitRoot agains the RollupExitRoot +|`globalIndex` | uint256 | Global index is defined as: +[0:190] not checked, [191] mainnet flag, rollupIndex [192, 223], localRootIndex[224, 255] +note that only the rollup index will be used only in case the mainnet flag is 0 +note that global index do not assert the unused bits to 0. +This means that when synching the events, the globalIndex must be decoded the same way that in the Smart contract +To avoid possible synch attacks |`mainnetExitRoot` | bytes32 | Mainnet exit root |`rollupExitRoot` | bytes32 | Rollup exit root |`originNetwork` | uint32 | Origin network @@ -125,9 +182,14 @@ will not trigger any execution #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`smtProofLocalExitRoot` | bytes32[32] | Smt proof -|`smtProofRollupExitRoot` | bytes32[32] | Smt proof -|`globalIndex` | uint256 | Index of the leaf +|`smtProofLocalExitRoot` | bytes32[32] | Smt proof to proof the leaf agains the exit root +|`smtProofRollupExitRoot` | bytes32[32] | Smt proof to proof the rollupLocalExitRoot agains the RollupExitRoot +|`globalIndex` | uint256 | Global index is defined as: +[0:190] not checked, [191] mainnet flag, rollupIndex [192, 223], localRootIndex [224, 255] +note that only the rollup index will be used only in case the mainnet flag is 0 +note that global index do not assert the unused bits to 0. +This means that when synching the events, the globalIndex must be decoded the same way that in the Smart contract +To avoid possible synch attacks |`mainnetExitRoot` | bytes32 | Mainnet exit root |`rollupExitRoot` | bytes32 | Rollup exit root |`originNetwork` | uint32 | Origin network @@ -226,7 +288,7 @@ Verify leaf and checks that it has not been claimed ```solidity function isClaimed( uint32 leafIndex, - uint32 originNetwork + uint32 sourceBridgeNetwork ) external returns (bool) ``` Function to check if an index is claimed or not @@ -236,7 +298,7 @@ Function to check if an index is claimed or not | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | |`leafIndex` | uint32 | Index -|`originNetwork` | uint32 | origin network +|`sourceBridgeNetwork` | uint32 | origin network ### updateGlobalExitRoot ```solidity diff --git a/docs/v2/PolygonZkEVMGlobalExitRootV2.md b/docs/v2/PolygonZkEVMGlobalExitRootV2.md index ba5867306..d6127a2e9 100644 --- a/docs/v2/PolygonZkEVMGlobalExitRootV2.md +++ b/docs/v2/PolygonZkEVMGlobalExitRootV2.md @@ -40,24 +40,6 @@ Return last global exit root -### getRoot -```solidity - function getRoot( - ) public returns (bytes32) -``` -Computes and returns the merkle root - - - -### makeHistoricGlobalExitRootSnapshot -```solidity - function makeHistoricGlobalExitRootSnapshot( - ) public -``` -Computes and returns the merkle root - - - ## Events ### UpdateGlobalExitRoot ```solidity @@ -67,11 +49,3 @@ Computes and returns the merkle root Emitted when the global exit root is updated -### HistoricGlobalExitRootSnapshot -```solidity - event HistoricGlobalExitRootSnapshot( - ) -``` - -Emitted when a snapshot of the historic global exit root is taken - diff --git a/docs/v2/consensus/dataComittee/CDKDataCommittee.md b/docs/v2/consensus/dataComittee/CDKDataCommittee.md new file mode 100644 index 000000000..b43f7504d --- /dev/null +++ b/docs/v2/consensus/dataComittee/CDKDataCommittee.md @@ -0,0 +1,75 @@ + + + +## Functions +### initialize +```solidity + function initialize( + ) external +``` + + + + +### setupCommittee +```solidity + function setupCommittee( + uint256 _requiredAmountOfSignatures, + string[] urls, + bytes addrsBytes + ) external +``` +Allows the admin to setup the members of the committee. Note that: +The system will require N / M signatures where N => _requiredAmountOfSignatures and M => urls.length +There must be the same amount of urls than addressess encoded in the addrsBytes +A member is represented by the url and the address contained in urls[i] and addrsBytes[i*_ADDR_SIZE : i*_ADDR_SIZE + _ADDR_SIZE] + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_requiredAmountOfSignatures` | uint256 | Required amount of signatures +|`urls` | string[] | List of urls of the members of the committee +|`addrsBytes` | bytes | Byte array that contains the addressess of the members of the committee + +### getAmountOfMembers +```solidity + function getAmountOfMembers( + ) public returns (uint256) +``` + + + + +### verifySignatures +```solidity + function verifySignatures( + bytes32 signedHash, + bytes signaturesAndAddrs + ) external +``` +Verifies that the given signedHash has been signed by requiredAmountOfSignatures committee members + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`signedHash` | bytes32 | Hash that must have been signed by requiredAmountOfSignatures of committee members +|`signaturesAndAddrs` | bytes | Byte array containing the signatures and all the addresses of the committee in ascending order +[signature 0, ..., signature requiredAmountOfSignatures -1, address 0, ... address N] +note that each ECDSA signatures are used, therefore each one must be 65 bytes + +## Events +### CommitteeUpdated +```solidity + event CommitteeUpdated( + bytes32 committeeHash + ) +``` + +Emitted when the committee is updated + +#### Parameters: +| Name | Type | Description | +| :----------------------------- | :------------ | :--------------------------------------------- | +|`committeeHash`| bytes32 | hash of the addresses of the committee members diff --git a/docs/v2/consensus/dataComittee/PolygonDataComittee.md b/docs/v2/consensus/dataComittee/PolygonDataComittee.md new file mode 100644 index 000000000..d5bba03dd --- /dev/null +++ b/docs/v2/consensus/dataComittee/PolygonDataComittee.md @@ -0,0 +1,76 @@ +Contract responsible for managing the states and the updates of L2 network. +There will be a trusted sequencer, which is able to send transactions. +Any user can force some transaction and the sequencer will have a timeout to add them in the queue. +The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof. +The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network. +To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks. + + +## Functions +### constructor +```solidity + function constructor( + contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + contract IERC20Upgradeable _pol, + contract IPolygonZkEVMBridge _bridgeAddress, + contract PolygonRollupManager _rollupManager + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | POL token address +|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address +|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address + +### sequenceBatches +```solidity + function sequenceBatches( + ) public +``` + + + + +### sequenceBatchesDataCommittee +```solidity + function sequenceBatchesDataCommittee( + struct PolygonDataComittee.ValidiumBatchData[] batches, + address l2Coinbase, + bytes dataAvailabilityMessage + ) external +``` +Allows a sequencer to send multiple batches + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`batches` | struct PolygonDataComittee.ValidiumBatchData[] | Struct array which holds the necessary data to append new batches to the sequence +|`l2Coinbase` | address | Address that will receive the fees from L2 +|`dataAvailabilityMessage` | bytes | Byte array containing the signatures and all the addresses of the committee in ascending order +[signature 0, ..., signature requiredAmountOfSignatures -1, address 0, ... address N] +note that each ECDSA signatures are used, therefore each one must be 65 bytes + +### switchSequenceWithDataAvailability +```solidity + function switchSequenceWithDataAvailability( + ) external +``` +Allow the admin to turn on the force batches +This action is not reversible + + + +## Events +### SwitchSequenceWithDataAvailability +```solidity + event SwitchSequenceWithDataAvailability( + ) +``` + +Emitted when switch the ability to sequence with data availability + diff --git a/docs/v2/consensus/zkEVM/PolygonZkEVMV2.md b/docs/v2/consensus/zkEVM/PolygonZkEVMV2.md new file mode 100644 index 000000000..05626cf12 --- /dev/null +++ b/docs/v2/consensus/zkEVM/PolygonZkEVMV2.md @@ -0,0 +1,28 @@ +Contract responsible for managing the states and the updates of L2 network. +There will be a trusted sequencer, which is able to send transactions. +Any user can force some transaction and the sequencer will have a timeout to add them in the queue. +The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof. +The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network. +To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks. + + +## Functions +### constructor +```solidity + function constructor( + contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + contract IERC20Upgradeable _pol, + contract IPolygonZkEVMBridge _bridgeAddress, + contract PolygonRollupManager _rollupManager + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | POL token address +|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address +|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address + diff --git a/docs/v2/consensus/zkEVM/PolygonZkEVMV2Existent.md b/docs/v2/consensus/zkEVM/PolygonZkEVMV2Existent.md new file mode 100644 index 000000000..eb04f3948 --- /dev/null +++ b/docs/v2/consensus/zkEVM/PolygonZkEVMV2Existent.md @@ -0,0 +1,53 @@ +Contract responsible for managing the states and the updates of L2 network. +There will be a trusted sequencer, which is able to send transactions. +Any user can force some transaction and the sequencer will have a timeout to add them in the queue. +The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof. +The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network. +To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks. + + +## Functions +### constructor +```solidity + function constructor( + contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + contract IERC20Upgradeable _pol, + contract IPolygonZkEVMBridge _bridgeAddress, + contract PolygonRollupManager _rollupManager + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | POL token address +|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address +|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address + +### initializeUpgrade +```solidity + function initializeUpgrade( + address _admin, + address _trustedSequencer, + string _trustedSequencerURL, + string _networkName, + bytes32 _lastAccInputHash, + uint64 _lastTimestamp + ) external +``` +note This initializer will be called instead of the PolygonRollupBase +This is a especial initializer since the zkEVM it's an already created network + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_admin` | address | Admin address +|`_trustedSequencer` | address | Trusted sequencer address +|`_trustedSequencerURL` | string | Trusted sequencer URL +|`_networkName` | string | L2 network name +|`_lastAccInputHash` | bytes32 | Acc input hash +|`_lastTimestamp` | uint64 | Timestamp + diff --git a/docs/v2/interfaces/ICDKDataCommittee.md b/docs/v2/interfaces/ICDKDataCommittee.md new file mode 100644 index 000000000..13b0d302b --- /dev/null +++ b/docs/v2/interfaces/ICDKDataCommittee.md @@ -0,0 +1,13 @@ + + + +## Functions +### verifySignatures +```solidity + function verifySignatures( + ) external +``` + + + + diff --git a/docs/v2/interfaces/ICDKDataCommitteeErrors.md b/docs/v2/interfaces/ICDKDataCommitteeErrors.md new file mode 100644 index 000000000..b28b04f64 --- /dev/null +++ b/docs/v2/interfaces/ICDKDataCommitteeErrors.md @@ -0,0 +1,3 @@ + + + diff --git a/docs/v2/interfaces/IPolygonDataComittee.md b/docs/v2/interfaces/IPolygonDataComittee.md new file mode 100644 index 000000000..b28b04f64 --- /dev/null +++ b/docs/v2/interfaces/IPolygonDataComittee.md @@ -0,0 +1,3 @@ + + + diff --git a/docs/v2/interfaces/IPolygonRollupBase.md b/docs/v2/interfaces/IPolygonRollupBase.md new file mode 100644 index 000000000..ca8d758f2 --- /dev/null +++ b/docs/v2/interfaces/IPolygonRollupBase.md @@ -0,0 +1,22 @@ + + + +## Functions +### initialize +```solidity + function initialize( + ) external +``` + + + + +### onVerifyBatches +```solidity + function onVerifyBatches( + ) external +``` + + + + diff --git a/docs/v2/interfaces/IPolygonRollupManager.md b/docs/v2/interfaces/IPolygonRollupManager.md new file mode 100644 index 000000000..b28b04f64 --- /dev/null +++ b/docs/v2/interfaces/IPolygonRollupManager.md @@ -0,0 +1,3 @@ + + + diff --git a/docs/v2/interfaces/IPolygonZkEVMBaseBridge.md b/docs/v2/interfaces/IPolygonZkEVMBaseBridge.md new file mode 100644 index 000000000..64dcd6b89 --- /dev/null +++ b/docs/v2/interfaces/IPolygonZkEVMBaseBridge.md @@ -0,0 +1,49 @@ + + + +## Functions +### bridgeAsset +```solidity + function bridgeAsset( + ) external +``` + + + + +### bridgeMessage +```solidity + function bridgeMessage( + ) external +``` + + + + +### claimAsset +```solidity + function claimAsset( + ) external +``` + + + + +### claimMessage +```solidity + function claimMessage( + ) external +``` + + + + +### updateGlobalExitRoot +```solidity + function updateGlobalExitRoot( + ) external +``` + + + + diff --git a/docs/v2/interfaces/IPolygonZkEVMBridgeV2.md b/docs/v2/interfaces/IPolygonZkEVMBridgeV2.md new file mode 100644 index 000000000..765f09ec5 --- /dev/null +++ b/docs/v2/interfaces/IPolygonZkEVMBridgeV2.md @@ -0,0 +1,31 @@ + + + +## Functions +### activateEmergencyState +```solidity + function activateEmergencyState( + ) external +``` + + + + +### deactivateEmergencyState +```solidity + function deactivateEmergencyState( + ) external +``` + + + + +### bridgeMessageWETH +```solidity + function bridgeMessageWETH( + ) external +``` + + + + diff --git a/docs/v2/interfaces/IPolygonZkEVMV2Errors.md b/docs/v2/interfaces/IPolygonZkEVMV2Errors.md new file mode 100644 index 000000000..b28b04f64 --- /dev/null +++ b/docs/v2/interfaces/IPolygonZkEVMV2Errors.md @@ -0,0 +1,3 @@ + + + diff --git a/docs/v2/lib/DepositContractBase.md b/docs/v2/lib/DepositContractBase.md new file mode 100644 index 000000000..98d0b10b3 --- /dev/null +++ b/docs/v2/lib/DepositContractBase.md @@ -0,0 +1,66 @@ +This contract will be used as a helper for all the sparse merkle tree related functions +Based on the implementation of the deposit eth2.0 contract https://github.com/ethereum/consensus-specs/blob/dev/solidity_deposit_contract/deposit_contract.sol + + +## Functions +### getRoot +```solidity + function getRoot( + ) public returns (bytes32) +``` +Computes and returns the merkle root + + + +### _addLeaf +```solidity + function _addLeaf( + bytes32 leaf + ) internal +``` +Add a new leaf to the merkle tree + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`leaf` | bytes32 | Leaf + +### verifyMerkleProof +```solidity + function verifyMerkleProof( + bytes32 leafHash, + bytes32[32] smtProof, + uint32 index, + bytes32 root + ) public returns (bool) +``` +Verify merkle proof + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`leafHash` | bytes32 | Leaf hash +|`smtProof` | bytes32[32] | Smt proof +|`index` | uint32 | Index of the leaf +|`root` | bytes32 | Merkle root + +### calculateRoot +```solidity + function calculateRoot( + bytes32 leafHash, + bytes32[32] smtProof, + uint32 index + ) public returns (bytes32) +``` +calcualte root from merkle proof + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`leafHash` | bytes32 | Leaf hash +|`smtProof` | bytes32[32] | Smt proof +|`index` | uint32 | Index of the leaf + diff --git a/docs/v2/lib/DepositContractV2.md b/docs/v2/lib/DepositContractV2.md new file mode 100644 index 000000000..9b73756b0 --- /dev/null +++ b/docs/v2/lib/DepositContractV2.md @@ -0,0 +1,31 @@ +This contract will be used as a helper for all the sparse merkle tree related functions +Based on the implementation of the deposit eth2.0 contract https://github.com/ethereum/consensus-specs/blob/dev/solidity_deposit_contract/deposit_contract.sol + + +## Functions +### getLeafValue +```solidity + function getLeafValue( + uint8 leafType, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes32 metadataHash + ) public returns (bytes32) +``` +Given the leaf data returns the leaf value + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`leafType` | uint8 | Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message +|`originNetwork` | uint32 | Origin Network +|`originAddress` | address | [0] Origin token address, 0 address is reserved for ether, [1] msg.sender of the message +|`destinationNetwork` | uint32 | Destination network +|`destinationAddress` | address | Destination address +|`amount` | uint256 | [0] Amount of tokens/ether, [1] Amount of ether +|`metadataHash` | bytes32 | Hash of the metadata + diff --git a/docs/v2/lib/LegacyZKEVMStateVariables.md b/docs/v2/lib/LegacyZKEVMStateVariables.md new file mode 100644 index 000000000..56054c790 --- /dev/null +++ b/docs/v2/lib/LegacyZKEVMStateVariables.md @@ -0,0 +1,5 @@ +Since the current contract of PolygonZkEVM will be upgraded to a PolygonRollupManager there's defined +all the legacy public variables in order to not use previous used storage slots +The variables will be used by the RollupManager only for initialize the zkEVM inside the initializer function + + diff --git a/docs/v2/lib/PolygonAccessControlUpgradeable.md b/docs/v2/lib/PolygonAccessControlUpgradeable.md new file mode 100644 index 000000000..5381fcd02 --- /dev/null +++ b/docs/v2/lib/PolygonAccessControlUpgradeable.md @@ -0,0 +1,186 @@ + +Contract AccessControlUpgradeable from Openzeppelin with the following modifications: +- Delete ERC165Upgradeable dependencies, which is not important to our contract and save us the "gap" +variables and let us have consistent storage +- Add the legacy Owner variable, to be consistent with the previous one +- Add custom errors +- Replace _msgSender() with msg.sender + +## Functions +### __AccessControl_init +```solidity + function __AccessControl_init( + ) internal +``` + + + + +### hasRole +```solidity + function hasRole( + ) public returns (bool) +``` + +Returns `true` if `account` has been granted `role`. + + +### _checkRole +```solidity + function _checkRole( + ) internal +``` + +Revert with a standard message if `msg.sender` is missing `role`. +Overriding this function changes the behavior of the {onlyRole} modifier. + +Format of the revert message is described in {_checkRole}. + +_Available since v4.6._ + + +### _checkRole +```solidity + function _checkRole( + ) internal +``` + +Revert with a standard message if `account` is missing `role`. + +The format of the revert reason is given by the following regular expression: + + /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + + +### getRoleAdmin +```solidity + function getRoleAdmin( + ) public returns (bytes32) +``` + +Returns the admin role that controls `role`. See {grantRole} and +{revokeRole}. + +To change a role's admin, use {_setRoleAdmin}. + + +### grantRole +```solidity + function grantRole( + ) public +``` + +Grants `role` to `account`. + +If `account` had not been already granted `role`, emits a {RoleGranted} +event. + +Requirements: + +- the caller must have ``role``'s admin role. + +May emit a {RoleGranted} event. + + +### revokeRole +```solidity + function revokeRole( + ) public +``` + +Revokes `role` from `account`. + +If `account` had been granted `role`, emits a {RoleRevoked} event. + +Requirements: + +- the caller must have ``role``'s admin role. + +May emit a {RoleRevoked} event. + + +### renounceRole +```solidity + function renounceRole( + ) public +``` + +Revokes `role` from the calling account. + +Roles are often managed via {grantRole} and {revokeRole}: this function's +purpose is to provide a mechanism for accounts to lose their privileges +if they are compromised (such as when a trusted device is misplaced). + +If the calling account had been revoked `role`, emits a {RoleRevoked} +event. + +Requirements: + +- the caller must be `account`. + +May emit a {RoleRevoked} event. + + +### _setupRole +```solidity + function _setupRole( + ) internal +``` + +Grants `role` to `account`. + +If `account` had not been already granted `role`, emits a {RoleGranted} +event. Note that unlike {grantRole}, this function doesn't perform any +checks on the calling account. + +May emit a {RoleGranted} event. + +[WARNING] +==== +This function should only be called from the constructor when setting +up the initial roles for the system. + +Using this function in any other way is effectively circumventing the admin +system imposed by {AccessControl}. +==== + +NOTE: This function is deprecated in favor of {_grantRole}. + + +### _setRoleAdmin +```solidity + function _setRoleAdmin( + ) internal +``` + +Sets `adminRole` as ``role``'s admin role. + +Emits a {RoleAdminChanged} event. + + +### _grantRole +```solidity + function _grantRole( + ) internal +``` + +Grants `role` to `account`. + +Internal function without access restriction. + +May emit a {RoleGranted} event. + + +### _revokeRole +```solidity + function _revokeRole( + ) internal +``` + +Revokes `role` from `account`. + +Internal function without access restriction. + +May emit a {RoleRevoked} event. + + diff --git a/docs/v2/lib/PolygonRollupBase.md b/docs/v2/lib/PolygonRollupBase.md new file mode 100644 index 000000000..49cb6dd34 --- /dev/null +++ b/docs/v2/lib/PolygonRollupBase.md @@ -0,0 +1,306 @@ +Contract responsible for managing the states and the updates of L2 network. +There will be a trusted sequencer, which is able to send transactions. +Any user can force some transaction and the sequencer will have a timeout to add them in the queue. +The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof. +The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network. +To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks. + + +## Functions +### constructor +```solidity + function constructor( + contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + contract IERC20Upgradeable _pol, + contract IPolygonZkEVMBridge _bridgeAddress, + contract PolygonRollupManager _rollupManager + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | POL token address +|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address +|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address + +### initialize +```solidity + function initialize( + address _admin, + address sequencer, + uint32 networkID, + address _gasTokenAddress, + uint32 _gasTokenNetwork, + string sequencerURL, + string _networkName + ) external +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_admin` | address | Admin address +|`sequencer` | address | Trusted sequencer address +|`networkID` | uint32 | Indicates the network identifier that will be used in the bridge +|`_gasTokenAddress` | address | Indicates the token address that will be used to pay gas fees in the new rollup +|`_gasTokenNetwork` | uint32 | Indicates the native network of the token address +|`sequencerURL` | string | Trusted sequencer URL +|`_networkName` | string | L2 network name + +### sequenceBatches +```solidity + function sequenceBatches( + struct PolygonRollupBase.BatchData[] batches, + address l2Coinbase + ) public +``` +Allows a sequencer to send multiple batches + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`batches` | struct PolygonRollupBase.BatchData[] | Struct array which holds the necessary data to append new batches to the sequence +|`l2Coinbase` | address | Address that will receive the fees from L2 + +### onVerifyBatches +```solidity + function onVerifyBatches( + uint64 lastVerifiedBatch, + bytes32 newStateRoot, + address aggregator + ) public +``` +Callback on verify batches, can only be called by the rollup manager + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`lastVerifiedBatch` | uint64 | Last verified batch +|`newStateRoot` | bytes32 | new state root +|`aggregator` | address | Aggregator address + +### forceBatch +```solidity + function forceBatch( + bytes transactions, + uint256 polAmount + ) public +``` +Allows a sequencer/user to force a batch of L2 transactions. +This should be used only in extreme cases where the trusted sequencer does not work as expected +Note The sequencer has certain degree of control on how non-forced and forced batches are ordered +In order to assure that users force transactions will be processed properly, user must not sign any other transaction +with the same nonce + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`transactions` | bytes | L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: +|`polAmount` | uint256 | Max amount of pol tokens that the sender is willing to pay + +### sequenceForceBatches +```solidity + function sequenceForceBatches( + struct PolygonRollupBase.ForcedBatchData[] batches + ) external +``` +Allows anyone to sequence forced Batches if the trusted sequencer has not done so in the timeout period + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`batches` | struct PolygonRollupBase.ForcedBatchData[] | Struct array which holds the necessary data to append force batches + +### setTrustedSequencer +```solidity + function setTrustedSequencer( + address newTrustedSequencer + ) external +``` +Allow the admin to set a new trusted sequencer + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newTrustedSequencer` | address | Address of the new trusted sequencer + +### setTrustedSequencerURL +```solidity + function setTrustedSequencerURL( + string newTrustedSequencerURL + ) external +``` +Allow the admin to set the trusted sequencer URL + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newTrustedSequencerURL` | string | URL of trusted sequencer + +### setForceBatchTimeout +```solidity + function setForceBatchTimeout( + uint64 newforceBatchTimeout + ) external +``` +Allow the admin to set the forcedBatchTimeout +The new value can only be lower, except if emergency state is active + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newforceBatchTimeout` | uint64 | New force batch timeout + +### activateForceBatches +```solidity + function activateForceBatches( + ) external +``` +Allow the admin to turn on the force batches +This action is not reversible + + + +### transferAdminRole +```solidity + function transferAdminRole( + address newPendingAdmin + ) external +``` +Starts the admin role transfer +This is a two step process, the pending admin must accepted to finalize the process + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newPendingAdmin` | address | Address of the new pending admin + +### acceptAdminRole +```solidity + function acceptAdminRole( + ) external +``` +Allow the current pending admin to accept the admin role + + + +### calculatePolPerForceBatch +```solidity + function calculatePolPerForceBatch( + ) public returns (uint256) +``` +Function to calculate the reward for a forced batch + + + +### generateInitializeTransaction +```solidity + function generateInitializeTransaction( + uint32 networkID, + address _gasTokenAddress, + uint32 _gasTokenNetwork + ) public returns (bytes) +``` +Generate Initialize transaction for hte bridge on L2 + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`networkID` | uint32 | Indicates the network identifier that will be used in the bridge +|`_gasTokenAddress` | address | Indicates the token address that will be used to pay gas fees in the new rollup +|`_gasTokenNetwork` | uint32 | Indicates the native network of the token address + +## Events +### SequenceBatches +```solidity + event SequenceBatches( + ) +``` + +Emitted when the trusted sequencer sends a new batch of transactions + +### ForceBatch +```solidity + event ForceBatch( + ) +``` + +Emitted when a batch is forced + +### SequenceForceBatches +```solidity + event SequenceForceBatches( + ) +``` + +Emitted when forced batches are sequenced by not the trusted sequencer + +### VerifyBatches +```solidity + event VerifyBatches( + ) +``` + +Emitted when a aggregator verifies batches + +### SetTrustedSequencer +```solidity + event SetTrustedSequencer( + ) +``` + +Emitted when the admin updates the trusted sequencer address + +### SetTrustedSequencerURL +```solidity + event SetTrustedSequencerURL( + ) +``` + +Emitted when the admin updates the sequencer URL + +### SetForceBatchTimeout +```solidity + event SetForceBatchTimeout( + ) +``` + +Emitted when the admin update the force batch timeout + +### ActivateForceBatches +```solidity + event ActivateForceBatches( + ) +``` + +Emitted when activate force batches + +### TransferAdminRole +```solidity + event TransferAdminRole( + ) +``` + +Emitted when the admin starts the two-step transfer role setting a new pending admin + +### AcceptAdminRole +```solidity + event AcceptAdminRole( + ) +``` + +Emitted when the pending admin accepts the admin role + diff --git a/docs/v2/lib/PolygonTransparentProxy.md b/docs/v2/lib/PolygonTransparentProxy.md new file mode 100644 index 000000000..c185c41e4 --- /dev/null +++ b/docs/v2/lib/PolygonTransparentProxy.md @@ -0,0 +1,37 @@ + +Contrac TransparentUpgradeableProxy from Openzeppelin v5 with the following modifications: +- Admin is a parameter in the constructor ( like previous versions) isntead of being deployed +- Let the admin get access to the proxy +- Add custom errors +- Replace _msgSender() with msg.sender + +## Functions +### constructor +```solidity + function constructor( + ) public +``` + +Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`, +backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in +{ERC1967Proxy-constructor}. + + +### _proxyAdmin +```solidity + function _proxyAdmin( + ) internal returns (address) +``` + +Returns the admin of this proxy. + + +### _fallback +```solidity + function _fallback( + ) internal +``` + +If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior. + + diff --git a/docs/v2/mocks/PolygonRollupManagerMock.md b/docs/v2/mocks/PolygonRollupManagerMock.md new file mode 100644 index 000000000..003c764d9 --- /dev/null +++ b/docs/v2/mocks/PolygonRollupManagerMock.md @@ -0,0 +1,39 @@ +PolygonRollupManager mock + + +## Functions +### constructor +```solidity + function constructor( + contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + contract IERC20Upgradeable _pol, + contract IPolygonZkEVMBridge _bridgeAddress + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | MATIC token address +|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address + +### initializeMock +```solidity + function initializeMock( + ) external +``` + + + + +### prepareMockCalculateRoot +```solidity + function prepareMockCalculateRoot( + ) public +``` + + + + diff --git a/package-lock.json b/package-lock.json index af6101bf6..c4ec2797b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@openzeppelin/contracts": "4.8.2", "@openzeppelin/contracts-upgradeable": "4.8.2", "@openzeppelin/contracts5": "npm:@openzeppelin/contracts@^5.0.0", - "@openzeppelin/hardhat-upgrades": "2.3.1", + "@openzeppelin/hardhat-upgrades": "2.3.3", "circomlibjs": "0.1.1", "dotenv": "^8.6.0", "eslint": "^8.51.0", @@ -26,7 +26,7 @@ "hardhat-dependency-compiler": "^1.1.3", "prettier": "^2.8.8", "prettier-plugin-solidity": "^1.1.3", - "solc-0.8": "npm:solc@^0.8.20", + "solc-0.8": "npm:solc@0.8.20", "solidity-docgen": "^0.5.17" } }, @@ -127,12 +127,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.425.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.425.0.tgz", - "integrity": "sha512-6lqbmorwerN4v+J5dqbHPAsjynI0mkEF+blf+69QTaKKGaxBBVaXgqoqul9RXYcK5MMrrYRbQIMd0zYOoy90kA==", + "version": "3.428.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.428.0.tgz", + "integrity": "sha512-4T0Ps2spjg3qbWE6ZK13Vd3FnzpfliaiotqjxUK5YhjDrKXeT36HJp46JhDupElQuHtTkpdiJOSYk2lvY2H4IA==", "dev": true, "dependencies": { - "@smithy/types": "^2.3.4", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -1010,6 +1010,18 @@ "node": ">=14" } }, + "node_modules/@ethereumjs/util/node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", @@ -1876,21 +1888,22 @@ } }, "node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", "dev": true, + "peer": true, "dependencies": { - "@noble/hashes": "1.3.1" + "@noble/hashes": "1.3.2" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "dev": true, "engines": { "node": ">= 16" @@ -1899,19 +1912,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true - }, "node_modules/@noble/secp256k1": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", @@ -3253,12 +3253,12 @@ "dev": true }, "node_modules/@openzeppelin/defender-admin-client": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/defender-admin-client/-/defender-admin-client-1.48.0.tgz", - "integrity": "sha512-MN29JD6jA3PgOxF2tG0aZbMIwOCieYWkK9UbHCq1UzGPrMgGV9NVMUyVdqpv7Ynplwsjp5ZTBDOyttwvTlchHg==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-admin-client/-/defender-admin-client-1.49.0.tgz", + "integrity": "sha512-ka+GTbsnGO6j1R2AGj027uu29es/EBVs3VjJStb+7u/1lNhx1xSRS11JBD0a0GNhrwqsKU4czIemlIKMlUzhhQ==", "dev": true, "dependencies": { - "@openzeppelin/defender-base-client": "1.48.0", + "@openzeppelin/defender-base-client": "1.49.0", "axios": "^1.4.0", "ethers": "^5.7.2", "lodash": "^4.17.19", @@ -3314,9 +3314,9 @@ } }, "node_modules/@openzeppelin/defender-base-client": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.48.0.tgz", - "integrity": "sha512-HFO87s010hRrMjyh2xYOCEAkLe21BfIbho7n5/kikA6A1ZgXi7MsEiqnQv1zP4bxMJgxGZ5b3t4tt6fWrakbag==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.49.0.tgz", + "integrity": "sha512-nG2jslaAUbo2ZW9yBStstxTPscAchN/vRdJ16M34whuZRtUp1bccCBVLdv3oiPOdjwFaa1OBXJkheN+eF8alzA==", "dev": true, "dependencies": { "amazon-cognito-identity-js": "^6.0.1", @@ -3326,16 +3326,39 @@ "node-fetch": "^2.6.0" } }, + "node_modules/@openzeppelin/defender-sdk-base-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.3.0.tgz", + "integrity": "sha512-OMMt7NaAL8C95ralF9nMeKZpg96COLZT9FPpGpPsI7aB8fVZfCM8+6k99gTF44hMS6IsRdN2WthS3m7VzQeeoA==", + "dev": true, + "dependencies": { + "amazon-cognito-identity-js": "^6.0.1", + "async-retry": "^1.3.3" + } + }, + "node_modules/@openzeppelin/defender-sdk-deploy-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.3.0.tgz", + "integrity": "sha512-RTYM3HnVvD2d5NoYfTug8UwT41e0Jjwb13lk9v0Jl8z7mcclUVvAnKD4DHJ4b8RhKpg4B15oLQK/Igzjg1HHRA==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.6.3", + "@openzeppelin/defender-sdk-base-client": "^1.3.0", + "axios": "^1.4.0", + "lodash": "^4.17.21" + } + }, "node_modules/@openzeppelin/hardhat-upgrades": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-2.3.1.tgz", - "integrity": "sha512-4QkhWIzvW/JaDp3ZupWnoJsUhkh0aXNSndsbqPPgsgEWDu7TME1XrXSb/3cNDCoyt/7KpcEl1XOwhyOYgp0bxg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-2.3.3.tgz", + "integrity": "sha512-rF87xYSz6Q2WFq5zcUF1T1tx3Kiq83hmke0xOBn5Qgrl++osseiDwS5oXfDK3NSWvj06oYGLERRGHcXnpQ31FQ==", "dev": true, "dependencies": { "@openzeppelin/defender-admin-client": "^1.48.0", "@openzeppelin/defender-base-client": "^1.48.0", - "@openzeppelin/platform-deploy-client": "^0.10.0", - "@openzeppelin/upgrades-core": "^1.30.0", + "@openzeppelin/defender-sdk-base-client": "^1.2.0", + "@openzeppelin/defender-sdk-deploy-client": "^1.2.0", + "@openzeppelin/upgrades-core": "^1.30.1", "chalk": "^4.1.0", "debug": "^4.1.1", "ethereumjs-util": "^7.1.5", @@ -3427,20 +3450,6 @@ "node": ">=8" } }, - "node_modules/@openzeppelin/platform-deploy-client": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/platform-deploy-client/-/platform-deploy-client-0.10.0.tgz", - "integrity": "sha512-jayQPeXqw4LnWIrNhNqgikJSre+n2NRrnEu76niSdVXc/faQkG3PmaHtRPJMFgsYxjjAiAfcMYyV95YBDuLexA==", - "deprecated": "@openzeppelin/platform-deploy-client is deprecated. Please use @openzeppelin/defender-sdk-deploy-client", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "@openzeppelin/defender-base-client": "^1.48.0-rc.1", - "axios": "^1.4.0", - "lodash": "^4.17.19", - "node-fetch": "^2.6.0" - } - }, "node_modules/@openzeppelin/upgrades-core": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.28.0.tgz", @@ -3816,10 +3825,22 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", "dev": true, "engines": { "node": ">= 16" @@ -3841,18 +3862,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@scure/bip39/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "dev": true, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@sentry/core": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", @@ -6881,7 +6890,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -7025,9 +7033,9 @@ } }, "node_modules/ethers": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", - "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.8.0.tgz", + "integrity": "sha512-zrFbmQRlraM+cU5mE4CZTLBurZTs2gdp2ld0nG/f3ecBK+x6lZ69KSxBqZ4NjclxwfTxl5LeNufcBbMsTdY53Q==", "dev": true, "funding": [ { @@ -7041,9 +7049,9 @@ ], "peer": true, "dependencies": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", "@types/node": "18.15.13", "aes-js": "4.0.0-beta.5", "tslib": "2.4.0", @@ -21175,9 +21183,9 @@ }, "node_modules/solc-0.8": { "name": "solc", - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.21.tgz", - "integrity": "sha512-N55ogy2dkTRwiONbj4e6wMZqUNaLZkiRcjGyeafjLYzo/tf/IvhHY5P5wpe+H3Fubh9idu071i8eOGO31s1ylg==", + "version": "0.8.20", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.20.tgz", + "integrity": "sha512-fPRnGspIEqmhu63RFO3pc79sLA7ZmzO0Uy0L5l6hEt2wAsq0o7UV6pXkAp3Mfv9IBhg7Px/oTu3a+y4gs3BWrQ==", "dev": true, "dependencies": { "command-exists": "^1.2.8", @@ -22391,9 +22399,9 @@ } }, "node_modules/typechain": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.1.tgz", - "integrity": "sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", + "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", "dev": true, "peer": true, "dependencies": { @@ -22775,6 +22783,18 @@ "node": ">=8.0.0" } }, + "node_modules/web3-utils/node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/web3-utils/node_modules/@noble/hashes": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", diff --git a/package.json b/package.json index 4b9878469..aab304694 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "@openzeppelin/contracts": "4.8.2", "@openzeppelin/contracts-upgradeable": "4.8.2", "@openzeppelin/contracts5": "npm:@openzeppelin/contracts@^5.0.0", - "@openzeppelin/hardhat-upgrades": "2.3.1", + "@openzeppelin/hardhat-upgrades": "2.3.3", "circomlibjs": "0.1.1", "dotenv": "^8.6.0", "eslint": "^8.51.0", @@ -47,7 +47,7 @@ "hardhat-dependency-compiler": "^1.1.3", "prettier": "^2.8.8", "prettier-plugin-solidity": "^1.1.3", - "solc-0.8": "npm:solc@^0.8.20", + "solc-0.8": "npm:solc@0.8.20", "solidity-docgen": "^0.5.17" }, "scripts": { diff --git a/test/contracts/bridge.test.js b/test/contracts/bridge.test.js index ffa8234f9..d88714fda 100644 --- a/test/contracts/bridge.test.js +++ b/test/contracts/bridge.test.js @@ -451,8 +451,8 @@ describe('PolygonZkEVMBridge Contract', () => { ); // Add 2 leafs - merkleTreeRollup + (leafValue); - merkleTreeRollup + (leafValue); + merkleTreeRollup.add(leafValue); + merkleTreeRollup.add(leafValue); // check merkle root with SC const rootJSRollup = merkleTreeRollup.getRoot(); @@ -637,7 +637,7 @@ describe('PolygonZkEVMBridge Contract', () => { ); expect(leafValueMainnet).to.be.equal(leafValueMainnetSC); - merkleTreeMainnet + (leafValueMainnet); + merkleTreeMainnet.add(leafValueMainnet); const rootJSMainnet = merkleTreeMainnet.getRoot(); // Tokens are burnt